ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDRiNjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcAotb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlXzEuMC4xLjIwMDYwMjE1MDEwNC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2OWE4Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+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+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5YWE3NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIENvbW1vbiBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBjb21tb24gdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjE2MGM3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QuY29tbW9uX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC5jb21tb25fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM4MmVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbGxlY3RvciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkN2I3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1qYXZhQ29tcGlsZXIucnVudGltZV9jb2xsZWN0b3IuamFyLmFyZ3MKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDE3NjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmRhNDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEp1biAwMyAwMjoyMDoyMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0ZDBkYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBydW50aW1lL2NvbGxlY3Rvci5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4yLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmIwMDdiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcnVudGltZS9jb2xsZWN0b3IuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UucnVudGltZS9jb2xsZWN0b3IuamFyID0gY29sbGVjdG9yLwotb3V0cHV0LnJ1bnRpbWUvY29sbGVjdG9yLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9TdWl0ZUhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1N1aXRlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0M2Y4ZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1N1aXRlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWl0ZUhlbHBlciB7Ci0KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBhbGxUZXN0cyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHB1YmxpYyBTdWl0ZUhlbHBlcihUZXN0U3VpdGUgc3VpdGUpIHsKLSAgICAgICAgYWRkVGVzdChzdWl0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiB0ZXN0cyA9ICgoVGVzdFN1aXRlKSB0ZXN0KS50ZXN0cygpOwotICAgICAgICAgICAgd2hpbGUgKHRlc3RzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdCB0ID0gKFRlc3QpIHRlc3RzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYWxsVGVzdHMucHV0KHQudG9TdHJpbmcoKSwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYWxsVGVzdHMucHV0KHRlc3QudG9TdHJpbmcoKSwgdGVzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEFsbFRlc3RzKCkgewotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gYWxsVGVzdHMua2V5cygpOwotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIHRlc3RMaXN0LmFkZChlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRlc3RMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgbzEpLmNvbXBhcmVUbygoKFN0cmluZykgbzIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSBuZXcgU3RyaW5nW3Rlc3RMaXN0LnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN0ckFycmF5W2ldID0gKFN0cmluZykgdGVzdExpc3QuZ2V0KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0ckFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0U3VpdGUgYnVpbGRTdWl0ZShTdHJpbmdbXSBjb21wbGV0ZVRlc3RzLCBTdHJpbmdbXSBwYXJ0aWFsVGVzdHMpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBsZXRlVGVzdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoKFRlc3QpIGFsbFRlc3RzLmdldChjb21wbGV0ZVRlc3RzW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWFsVGVzdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoZ2V0VGVzdChwYXJ0aWFsVGVzdHNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFRlc3RNZXRob2RzKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBBcnJheUxpc3QgbWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgVGVzdCB0ZXN0ID0gKFRlc3QpIGFsbFRlc3RzLmdldCh0ZXN0TmFtZSk7Ci0gICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdFN1aXRlKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiB0ZXN0c0VudW0gPSAoKFRlc3RTdWl0ZSkgdGVzdCkudGVzdHMoKTsKLSAgICAgICAgICAgIHdoaWxlICh0ZXN0c0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBUZXN0IHQgPSAoVGVzdCkgdGVzdHNFbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTGlzdC5hZGQodC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWV0aG9kTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIG8xKS5jb21wYXJlVG8oKChTdHJpbmcpIG8yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIFN0cmluZ1tdIHN0ckFycmF5ID0gbmV3IFN0cmluZ1ttZXRob2RMaXN0LnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHN0ckFycmF5W2ldID0gKFN0cmluZykgbWV0aG9kTGlzdC5nZXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyQXJyYXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUZXN0IGdldFN1YlRlc3QoVGVzdFN1aXRlIHN1aXRlLCBTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gc3VpdGUpIHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIHRlc3RzID0gc3VpdGUudGVzdHMoKTsKLSAgICAgICAgICAgIHdoaWxlICh0ZXN0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFRlc3QgdCA9IChUZXN0KSB0ZXN0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmICh0LnRvU3RyaW5nKCkuZXF1YWxzKHRlc3ROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFRlc3RTdWl0ZSB0byBydW4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRlc3QgZ2V0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgaW50IGZpcnN0SW5kZXggPSB0ZXN0TmFtZS5pbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHN1aXRlTmFtZSA9IHRlc3ROYW1lLnN1YnN0cmluZygwLCBmaXJzdEluZGV4KTsKLSAgICAgICAgU3RyaW5nIHN1YlRlc3ROYW1lID0gdGVzdE5hbWUuc3Vic3RyaW5nKGZpcnN0SW5kZXggKyAxKTsKLQotICAgICAgICAvL2NoZWNrIHRoZSBvYnZpb3VzIHN1aXRlIGZpcnN0Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIGFsbFRlc3RzLmdldChzdWl0ZU5hbWUpOwotICAgICAgICBUZXN0IHRlc3QgPSBnZXRTdWJUZXN0KHN1aXRlLCBzdWJUZXN0TmFtZSk7Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXN0OwotICAgICAgICB9Ci0gICAgICAgIC8vb3RoZXJ3aXNlIGNoZWNrIGFsbCBzdWl0ZXMKLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGFsbFRlc3RzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAodGVzdE5hbWUuc3RhcnRzV2l0aChrZXkpKSB7Ci0gICAgICAgICAgICAgICAgc3VpdGUgPSAoVGVzdFN1aXRlKSBhbGxUZXN0cy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBzdWJUZXN0TmFtZSA9IHRlc3ROYW1lLnN1YnN0cmluZyhrZXkubGVuZ3RoKCkgKyAxKTsKLSAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0U3ViVGVzdChzdWl0ZSwgc3ViVGVzdE5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9TdWl0ZVRlc3RSdW5uZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9TdWl0ZVRlc3RSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhYjM4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9jb2xsZWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9jb2xsZWN0b3IvU3VpdGVUZXN0UnVubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU3VpdGVUZXN0UnVubmVyIGV4dGVuZHMgVGVzdFJ1bm5lciB7Ci0KLSAgICBwcml2YXRlIFRlc3RTdWl0ZSBzdWl0ZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBQbHVnaW5UZXN0UnVubmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN1aXRlVGVzdFJ1bm5lcihUZXN0U3VpdGUgc3VpdGVUb1J1bikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzdWl0ZSA9IHN1aXRlVG9SdW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT25seSByZXR1cm4gdGhlIHNwZWNpZmllZCBzdWl0ZQotICAgICAqLwotICAgIHB1YmxpYyBUZXN0IGdldFRlc3QoU3RyaW5nIHN1aXRlQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjYWxsZWQgYnkgdGhlIGd1aQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxhdW5jaCgpIHsKLSAgICAgICAgc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiZHluYW1pYyB0ZXN0IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmRnJhbWUgPSBjcmVhdGVVSShuYW1lKTsKLSAgICAgICAgZkZyYW1lLnBhY2soKTsKLSAgICAgICAgZkZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIHNldFN1aXRlKG5hbWUpOwotICAgICAgICBydW5TdWl0ZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBUZXN0UnVubmVyI3Rlcm1pbmF0ZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVybWluYXRlKCkgewotICAgICAgICBmRnJhbWUuZGlzcG9zZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJiZDI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlzaGVsbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCXNoZWxsLnNldFRleHQoIlRlc3QgQ29sbGVjdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJVGVzdENvbGxlY3RvckdVSSB0ZXN0Q29sbGVjdG9yR1VJID0gbmV3IFRlc3RDb2xsZWN0b3JHVUkoc2hlbGwsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICB0ZXN0Q29sbGVjdG9yR1VJLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgCi0JCXNoZWxsLnNldFNpemUoNTAwLCA1MDApOwotCQlzaGVsbC5vcGVuKCk7Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JHVUkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9yR1VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNjI1MmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JHVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb2xsZWN0b3JHVUkgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUlURVNfRVhUX1BUID0gInN1aXRlcyI7IC8vJE5PTi1OTFMtMSQKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbXBvc2l0ZSBpbm5lclBhbmVzID0gbnVsbDsKLQlwcml2YXRlIENvbWJvIGNvbWJvID0gbnVsbDsKLQotCXByaXZhdGUgSGFzaHRhYmxlIHRlc3RTdWl0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFRlc3RDb2xsZWN0b3JHVUkoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCi0JCWxvYWRDb25maWd1cmF0aW9uKCk7Ci0KLQkJY3JlYXRlUGFydENvbnRyb2woKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZENvbmZpZ3VyYXRpb24oKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBzdWl0ZUV4dFB0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIFNVSVRFU19FWFRfUFQpOwotCQlJRXh0ZW5zaW9uW10gc3VpdGVzRXh0ZW5zaW9ucyA9IHN1aXRlRXh0UHQuZ2V0RXh0ZW5zaW9ucygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGVzRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBzdWl0ZXNFeHRlbnNpb25zW2ldOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdGVzdHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHRlc3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSB0ZXN0c1tqXTsKLQkJCQkJU3RyaW5nIHN1aXRlTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGVzdFN1aXRlcy5wdXQoc3VpdGVOYW1lLCBlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCi0JCWNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5SRUFEX09OTFkpOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gdGVzdFN1aXRlcy5rZXlzKCk7Ci0JCUFycmF5TGlzdCBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlhcnJheUxpc3QuYWRkKGtleXMubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KGFycmF5TGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlyZXR1cm4gKChTdHJpbmcpIG8xKS5jb21wYXJlVG8oKChTdHJpbmcpIG8yKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQljb21iby5hZGQoKFN0cmluZykgYXJyYXlMaXN0LmdldChpKSk7Ci0JCX0KLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAoY29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQljb21iby5zZWxlY3QoMCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKGUuZ2V0U291cmNlKCkgPT0gY29tYm8pIHsKLQkJCXVwZGF0ZUNvbWJvKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbWJvKE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKG51bGwgIT0gaW5uZXJQYW5lcykgewotCQkJaW5uZXJQYW5lcy5kaXNwb3NlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZXN0TmFtZSA9IGNvbWJvLmdldFRleHQoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgdGVzdFN1aXRlcy5nZXQodGVzdE5hbWUpOwotCQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpbm5lclBhbmVzID0gbmV3IFRlc3RDb2xsZWN0b3JJbm5lclBhbmVzKHRoaXMsIFNXVC5OVUxMLCBuZXcgU3VpdGVIZWxwZXIoc3VpdGUpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlpbm5lclBhbmVzID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTlVMTCk7Ci0JCQlpbm5lclBhbmVzLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWlubmVyUGFuZXMuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotCQkJTGFiZWwgZXJyb3JMYWJlbCA9IG5ldyBMYWJlbChpbm5lclBhbmVzLCBTV1QuTk9ORSk7Ci0JCQllcnJvckxhYmVsLnNldFRleHQoZXguZ2V0TWVzc2FnZSgpKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQllcnJvckxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJaW5uZXJQYW5lcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJbGF5b3V0KCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL2NvbGxlY3Rvci9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL2NvbGxlY3Rvci9UZXN0Q29sbGVjdG9ySW5uZXJQYW5lcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JJbm5lclBhbmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MmQ5NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvY29sbGVjdG9yL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvY29sbGVjdG9yL1Rlc3RDb2xsZWN0b3JJbm5lclBhbmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4KLSAqIFRvIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbGxlY3RvcklubmVyUGFuZXMgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0gICAgcHJpdmF0ZSBUYWJsZSB0ZXN0Q2xhc3NUYWJsZTsKLSAgICBwcml2YXRlIFRhYmxlIHRlc3RNZXRob2RUYWJsZTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGxhdW5jaFRlc3RCdXR0b247Ci0KLSAgICBwcml2YXRlIFN1aXRlSGVscGVyIHBsdWdpblRlc3RMb2FkZXI7Ci0KLSAgICBwcml2YXRlIEhhc2hTZXQgcGFydGlhbFNldEhhc2ggPSBuZXcgSGFzaFNldCgpOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIHNob3J0VG9GdWxsSGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGZ1bGxUb1Nob3J0SGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHVibGljIFRlc3RDb2xsZWN0b3JJbm5lclBhbmVzKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3VpdGVIZWxwZXIgbG9hZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBwbHVnaW5UZXN0TG9hZGVyID0gbG9hZGVyOwotICAgICAgICBjcmVhdGVQYXJ0Q29udHJvbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKCkgewotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICBzZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbnVsbDsKLQotICAgICAgICBHcm91cCB0YWJsZUdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCB0YWJsZUdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgdGFibGVHcm91cExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgICAgICB0YWJsZUdyb3VwTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICB0YWJsZUdyb3VwTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgdGFibGVHcm91cExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgICB0YWJsZUdyb3VwLnNldExheW91dCh0YWJsZUdyb3VwTGF5b3V0KTsKLSAgICAgICAgdGFibGVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgICAgICBTYXNoRm9ybSBzcGxpdFZpZXcgPSBuZXcgU2FzaEZvcm0odGFibGVHcm91cCwgU1dULkhPUklaT05UQUwpOwotICAgICAgICBzcGxpdFZpZXcuc2V0QmFja2dyb3VuZChnZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSkpOwotICAgICAgICAKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzcGxpdFZpZXcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBDb21wb3NpdGUgbGVmdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc3BsaXRWaWV3LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGVmdExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxlZnRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxlZnRDb21wb3NpdGUuc2V0TGF5b3V0KGxlZnRMYXlvdXQpOwotICAgICAgICBMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwobGVmdENvbXBvc2l0ZSwgU1dULk5VTEwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgICAgICBsYWJlbDIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGxhYmVsMi5zZXRUZXh0KCJUZXN0IFN1aXRlcyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgQ29tcG9zaXRlIHJpZ2h0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzcGxpdFZpZXcsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCByaWdodExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIHJpZ2h0TGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgICByaWdodENvbXBvc2l0ZS5zZXRMYXlvdXQocmlnaHRMYXlvdXQpOwotICAgICAgICBMYWJlbCBsYWJlbDMgPSBuZXcgTGFiZWwocmlnaHRDb21wb3NpdGUsIFNXVC5OVUxMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICAgICAgbGFiZWwzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBsYWJlbDMuc2V0VGV4dCgiVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRlc3RDbGFzc1RhYmxlID0gbmV3IFRhYmxlKGxlZnRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0gICAgICAgIHRlc3RDbGFzc1RhYmxlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgdGVzdENsYXNzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIFN0cmluZ1tdIGFsbFRlc3RzID0gcGx1Z2luVGVzdExvYWRlci5nZXRBbGxUZXN0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbFRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0ZXN0Q2xhc3NUYWJsZSwgU1dULk5VTEwpOwotICAgICAgICAgICAgdGFibGVJdGVtLnNldFRleHQoYWxsVGVzdHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHRlc3RDbGFzc1RhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGUuaXRlbTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSBpdGVtLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVNZXRob2RUYWJsZSh0ZXN0TmFtZSwgcGx1Z2luVGVzdExvYWRlci5nZXRUZXN0TWV0aG9kcyh0ZXN0TmFtZSkpOwotICAgICAgICAgICAgICAgIHRlc3RDbGFzc1RhYmxlLnNldFNlbGVjdGlvbihuZXcgVGFibGVJdGVtW10geyBpdGVtIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGxlZnRDb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgQnV0dG9uIHNlbGVjdEFsbENoZWNrYm94ID0gbmV3IEJ1dHRvbihsZWZ0Q29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotICAgICAgICBzZWxlY3RBbGxDaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAgICAgc2VsZWN0QWxsQ2hlY2tib3guc2V0VGV4dCgiU2VsZWN0IEFsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNlbGVjdEFsbENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgIAkJYm9vbGVhbiBjaGVja2VkID0gc2VsZWN0QWxsQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIAkJVGFibGVJdGVtIFtdIGl0ZW1zID0gdGVzdENsYXNzVGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgICAgCQlmb3IoaW50IGk9MDtpPGl0ZW1zLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgCQkJaXRlbXNbaV0uc2V0Q2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRlc3RNZXRob2RUYWJsZSA9IG5ldyBUYWJsZShyaWdodENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgdGVzdE1ldGhvZFRhYmxlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgdGVzdE1ldGhvZFRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGxhdW5jaFRlc3RCdXR0b24gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5QVVNIKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBsYXVuY2hUZXN0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBsYXVuY2hUZXN0QnV0dG9uLnNldFRleHQoIlJ1biBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGxhdW5jaFRlc3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN1aXRlVGVzdFJ1bm5lciBydW5uZXIgPSBuZXcgU3VpdGVUZXN0UnVubmVyKGJ1aWxkU3VpdGUoKSk7Ci0gICAgICAgICAgICAgICAgcnVubmVyLmxhdW5jaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0b3JlTWV0aG9kc1RhYmxlKCkgewotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRlc3RNZXRob2RUYWJsZS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgbnVsbCAhPSBpdGVtcyAmJiBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0aWFsVGVzdE5hbWUgPSAoU3RyaW5nKXNob3J0VG9GdWxsSGFzaHRhYmxlLmdldChpdGVtc1tpXS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmdldENoZWNrZWQoKSAmJiAhcGFydGlhbFNldEhhc2guY29udGFpbnMocGFydGlhbFRlc3ROYW1lKSkgewotICAgICAgICAgICAgICAgIHBhcnRpYWxTZXRIYXNoLmFkZChwYXJ0aWFsVGVzdE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXRlbXNbaV0uZ2V0Q2hlY2tlZCgpICYmIHBhcnRpYWxTZXRIYXNoLmNvbnRhaW5zKHBhcnRpYWxUZXN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJ0aWFsU2V0SGFzaC5yZW1vdmUocGFydGlhbFRlc3ROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNZXRob2RUYWJsZShTdHJpbmcgdGVzdE5hbWUsIFN0cmluZ1tdIG1ldGhvZEFycmF5KSB7Ci0gICAgICAgIHN0b3JlTWV0aG9kc1RhYmxlKCk7Ci0gICAgICAgIHRlc3RNZXRob2RUYWJsZS5yZW1vdmVBbGwoKTsKLQkJc2hvcnRUb0Z1bGxIYXNodGFibGUuY2xlYXIoKTsKLQkJZnVsbFRvU2hvcnRIYXNodGFibGUuY2xlYXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgbnVsbCAhPSBtZXRob2RBcnJheSAmJiBpIDwgbWV0aG9kQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXJ0aWFsVGVzdE5hbWUgPSB0ZXN0TmFtZSArICIuIiArIG1ldGhvZEFycmF5W2ldOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBtZXRob2RBcnJheVtpXS5pbmRleE9mKCcoJyk7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGVuZEluZGV4ID4gMCA/IG1ldGhvZEFycmF5W2ldLnN1YnN0cmluZygwLCBlbmRJbmRleCkgOiBtZXRob2RBcnJheVtpXTsKLSAgICAgICAgICAgIHNob3J0VG9GdWxsSGFzaHRhYmxlLnB1dChtZXRob2ROYW1lLCBwYXJ0aWFsVGVzdE5hbWUpOwotICAgICAgICAgICAgZnVsbFRvU2hvcnRIYXNodGFibGUucHV0KHBhcnRpYWxUZXN0TmFtZSwgbWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0ZXN0TWV0aG9kVGFibGUsIFNXVC5OVUxMKTsKLSAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRUZXh0KG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgdGFibGVJdGVtLnNldENoZWNrZWQocGFydGlhbFNldEhhc2guY29udGFpbnMocGFydGlhbFRlc3ROYW1lKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdFN1aXRlIGJ1aWxkU3VpdGUoKSB7Ci0gICAgICAgIEFycmF5TGlzdCBjb21wbGV0ZVRlc3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRlc3RDbGFzc1RhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtc1tpXS5nZXRDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0ZVRlc3RzLmFkZChpdGVtc1tpXS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gY29tcGxldGVBcnJheSA9IG5ldyBTdHJpbmdbY29tcGxldGVUZXN0cy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBsZXRlQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbXBsZXRlQXJyYXlbaV0gPSAoU3RyaW5nKSBjb21wbGV0ZVRlc3RzLmdldChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBwYXJ0aWFsVGVzdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHN0b3JlTWV0aG9kc1RhYmxlKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFydGlhbFNldEhhc2guaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgcGFydGlhbFRlc3RzLmFkZChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcGFydGlhbEFycmF5ID0gbmV3IFN0cmluZ1twYXJ0aWFsVGVzdHMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWFsQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHBhcnRpYWxBcnJheVtpXSA9IChTdHJpbmcpIHBhcnRpYWxUZXN0cy5nZXQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGx1Z2luVGVzdExvYWRlci5idWlsZFN1aXRlKGNvbXBsZXRlQXJyYXksIHBhcnRpYWxBcnJheSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRkZTc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvcj1vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvcgotc3VpdGVzPXN1aXRlcwotVGVzdF9Db2xsZWN0b3I9VGVzdCBDb2xsZWN0b3IKLVdUUF9UZXN0cz1XVFAgVGVzdHMKLU9wZW49T3BlbgotVGVzdF9Db2xsZWN0b3I9VGVzdCBDb2xsZWN0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ODZmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic3VpdGVzIiBuYW1lPSIlc3VpdGVzIiBzY2hlbWE9InNjaGVtYS9zdWl0ZXMuZXhzZCIvPgotCi0KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IiVUZXN0X0NvbGxlY3RvciIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiCi0gICAgICAgICAgICBpZD0idGVzdENvbGxlY3RvciI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVXVFBfVGVzdHMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IudGVzdHNNZW51Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgIG5hbWU9Imdyb3VwMSI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlT3BlbiIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVUZXN0X0NvbGxlY3RvciIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci5UZXN0Q29sbGVjdG9yQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IudGVzdHNNZW51L2dyb3VwMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci50ZXN0c0FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Ivc2NoZW1hL3N1aXRlcy5leHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Ivc2NoZW1hL3N1aXRlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVjM2M1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yL3NjaGVtYS9zdWl0ZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3RvciI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IiIGlkPSJzdWl0ZXMiIG5hbWU9InN1aXRlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzdWl0ZSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdWl0ZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzI0NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzBjNmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXVpLmphcgotamF2YUNvbXBpbGVyLnVpLmphci5hcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmZTc4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzc4ZDNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIEp1biAwMyAwMjoyMDo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTUwM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVVaV9QbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAwLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogdWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLlVpUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlRWNsaXBzZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWUxNzM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLnVpLmphciA9IHNyYy8KLW91dHB1dC51aS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHVpLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDY5YzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVWlfUGx1Zy1pbj1UZXN0IFVpIFBsdWctaW4KLUVjbGlwc2U9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGNiNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuY29sbGVjdG9yLnN1aXRlcyI+Ci0gICAgICAgICA8c3VpdGUKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLkRhdGFNb2RlbFVJQVBJVGVzdHMiCi0gICAgICAgICAgICBuYW1lPSJEYXRhTW9kZWwgVUkgQVBJIFRlc3RzIj4KLSAgICAgICAgIDwvc3VpdGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuRGF0YU1vZGVsV2l6YXJkRXh0ZW5zaW9uIj4KLSAgICAgIDxEYXRhTW9kZWxXaXphcmQKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLlRlc3REYXRhTW9kZWxXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpLndpemFyZFBhZ2VHcm91cCI+Ci0gICAgICA8d2l6YXJkUGFnZUdyb3VwCi0gICAgICAgICAgICBwYWdlR3JvdXBJRD0iZm9vIgotICAgICAgICAgICAgd2l6YXJkSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkLlRlc3QyRGF0YU1vZGVsUHJvdmlkZXIiPgotICAgICAgICAgPGZhY3RvcnkgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkiLz4KLSAgICAgIDwvd2l6YXJkUGFnZUdyb3VwPgotICAgICAgPHdpemFyZFBhZ2VHcm91cAotICAgICAgICAgICAgcGFnZUdyb3VwSUQ9ImJhciIKLSAgICAgICAgICAgIHdpemFyZElEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxmYWN0b3J5IGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5MiIvPgotICAgICAgPC93aXphcmRQYWdlR3JvdXA+Ci0gICAgICA8d2l6YXJkUGFnZUdyb3VwCi0gICAgICAgICAgICBwYWdlR3JvdXBJRD0iZm9vYmFyIgotICAgICAgICAgICAgd2l6YXJkSUQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkLlRlc3QyRGF0YU1vZGVsUHJvdmlkZXIiPgotICAgICAgICAgPGZhY3RvcnkgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkzIi8+Ci0gICAgICA8L3dpemFyZFBhZ2VHcm91cD4KLSAgICAgIDx3aXphcmRQYWdlCi0gICAgICAgICAgICB3aXphcmRJRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5Ij4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDwvd2l6YXJkUGFnZT4KLSAgICAgIDx3aXphcmRQYWdlCi0gICAgICAgICAgICB3aXphcmRJRD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQuVGVzdDJEYXRhTW9kZWxQcm92aWRlciI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5MiI+Ci0gICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICA8L3dpemFyZFBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgCi0gICAgIDwhLS0KLSAgIAkJQSBwaWN0dXJlIG9mIHRoZSBvcGVyYXRpb24gdHJlZQotICAJCS8qKgotCQkgKiBPcGVyYXRpb25zIGFyZSBvcmdhbml6ZWQgYXMgZm9sbG93czogPGNvZGU+Ci0JCSAqCSAgICBECi0JCSAqICAgICAvIFwKLQkJICogICAgLyAgIFwKLQkJICogICBCICAgICBGCi0JCSAqICAvIFwgICAvIFwKLQkJICogQSAgIEMgRSAgIEcKLQkJICogPC9jb2RlPgotCQkgKi8KLSAgICAgICAtLT4KLSAgIAotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLk9wZXJhdGlvbkV4dGVuc2lvbiIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIiPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlci5EIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRiIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuQiIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlci5CIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuQyIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuQSIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlci5GIgotICAgICAgICAgICAgcG9zdE9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRyIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXIuRSIvPgotICAgPC9leHRlbnNpb24+Ci0gIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvRGF0YU1vZGVsVUlBUElUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUFQSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzFlMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUFQSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZC5UZXN0V2l6YXJkVGVzdGNhc2U7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsVUlBUElUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsVUlBUElUZXN0cygpOwotCX0KLQotCXB1YmxpYyBEYXRhTW9kZWxVSUFQSVRlc3RzKCkgewotCQlzdXBlcigpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRGF0YU1vZGVsVUlGYWN0b3J5VGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoVGVzdFdpemFyZFRlc3RjYXNlLmNsYXNzKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9EYXRhTW9kZWxVSUZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL0RhdGFNb2RlbFVJRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyZDI4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL0RhdGFNb2RlbFVJRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERhdGFNb2RlbFVJRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JRCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHkoSVRlc3REYXRhTW9kZWwuRk9PKSk7Ci0JCURhdGFNb2RlbFdpemFyZCB3aXphcmQgPSBEYXRhTW9kZWxXaXphcmRGYWN0b3J5LmNyZWF0ZVdpemFyZCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5JVGVzdERhdGFNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwod2l6YXJkKTsKLQkJYXNzZXJ0Tm90TnVsbCh3aXphcmQuZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVRlc3REYXRhTW9kZWwuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5KElUZXN0RGF0YU1vZGVsLkZPTykpOwotCQlEYXRhTW9kZWxXaXphcmQgd2l6YXJkID0gRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5jcmVhdGVXaXphcmQoSVRlc3REYXRhTW9kZWwuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKHdpemFyZCk7Ci0JCWFzc2VydE5vdE51bGwod2l6YXJkLmdldERhdGFNb2RlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JbnN0YW5jZSgpIHsKLQkJaW50IHN0YXJ0SW5zdGFuY2VDb3VudCA9IFRlc3REYXRhTW9kZWxQcm92aWRlci5nZXRJbnN0YW5jZUNvdW50KCk7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFRlc3REYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQkJRGF0YU1vZGVsV2l6YXJkIHdpemFyZCA9IERhdGFNb2RlbFdpemFyZEZhY3RvcnkuY3JlYXRlV2l6YXJkKGRhdGFNb2RlbCk7Ci0JCWFzc2VydE5vdE51bGwod2l6YXJkKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwgPT0gd2l6YXJkLmdldERhdGFNb2RlbCgpKTsKLQkJaW50IGVuZEluc3RhbmNlQ291bnQgPSBUZXN0RGF0YU1vZGVsUHJvdmlkZXIuZ2V0SW5zdGFuY2VDb3VudCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW5kSW5zdGFuY2VDb3VudC1zdGFydEluc3RhbmNlQ291bnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9UZXN0RGF0YU1vZGVsV2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL1Rlc3REYXRhTW9kZWxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNDRjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL1Rlc3REYXRhTW9kZWxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgVGVzdERhdGFNb2RlbFdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0KLQlwdWJsaWMgVGVzdERhdGFNb2RlbFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdERhdGFNb2RlbFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3REYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9VaVBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9VaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzZmYzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLlVpUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aSIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTdmNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQmFzZU9wZXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9CLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY0MWI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQiBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQmFzZU9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0Jhc2VPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYjFmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQmFzZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBWZWN0b3IgcmVzdWx0TGlzdDsKLQlwdWJsaWMgc3RhdGljIFZlY3RvciB1bmRvTGlzdDsKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCXByaXZhdGUgYm9vbGVhbiBjaGVja01vZGVsczsKLQlwcml2YXRlIGJvb2xlYW4gbW9kZWxzT0sgPSBmYWxzZTsKLQotCXB1YmxpYyBCYXNlT3BlcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmVzdWx0TGlzdC5hZGQoZ2V0SUQoKSk7Ci0KLQkJZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoImV4ZWN1dGVkT3BzIiwgcmVzdWx0TGlzdCk7Ci0JCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KCJleGVjdXRlZFVuZG9PcHMiLCB1bmRvTGlzdCk7Ci0JCWlmIChjaGVja01vZGVscykKLQkJCW1vZGVsc09LID0gY2hlY2tNb2RlbHMoKTsKLQotCQlnZXRFbnZpcm9ubWVudCgpLmdldExvZygpLmxvZyhJTG9nLk9LLCAxMjM0LCB0aGlzLCAiQmFzZU9wZXJhdGlvbiIsIChUaHJvd2FibGUpIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJlc3VsdExpc3QucmVtb3ZlKHJlc3VsdExpc3Quc2l6ZSgpIC0gMSk7Ci0JCXVuZG9MaXN0LmFkZChnZXRJRCgpKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tNb2RlbHMoYm9vbGVhbiBjaGVja01vZGVscykgewotCQl0aGlzLmNoZWNrTW9kZWxzID0gY2hlY2tNb2RlbHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kZWxzT0soKSB7Ci0JCXJldHVybiBtb2RlbHNPSzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RlbHMoKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBnZXREYXRhTW9kZWwoKTsKLQotCQlib29sZWFuIGNvbnRhaW5zTW9kZWwxID0gbW9kZWwuaXNOZXN0ZWRNb2RlbCgidGVzdHByb3ZpZGVyMSIpOwotCQlib29sZWFuIGNvbnRhaW5zTW9kZWwyID0gbW9kZWwuaXNOZXN0ZWRNb2RlbCgidGVzdHByb3ZpZGVyMiIpOwotCQlib29sZWFuIHByb3AxID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDEiKTsKLQkJYm9vbGVhbiBwcm9wMiA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3AyIik7Ci0JCWJvb2xlYW4gcHJvcDMgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjFQcm9wMyIpOwotCQlib29sZWFuIHByb3A0ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDQiKTsKLQkJYm9vbGVhbiBwcm9wNSA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3AxIik7Ci0JCWJvb2xlYW4gcHJvcDYgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wMiIpOwotCQlib29sZWFuIHByb3A3ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIyUHJvcDMiKTsKLQkJYm9vbGVhbiBwcm9wOCA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3A0Iik7Ci0JCWJvb2xlYW4gdmFsdWUxID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3AxIikuZXF1YWxzKCIxMSIpOwotCQlib29sZWFuIHZhbHVlMiA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wMiIpLmVxdWFscygiMjIiKTsKLQkJYm9vbGVhbiB2YWx1ZTMgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIxUHJvcDMiKS5lcXVhbHMoIjMzIik7Ci0JCWJvb2xlYW4gdmFsdWU0ID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3A0IikuZXF1YWxzKCI0NCIpOwotCQlib29sZWFuIHZhbHVlNSA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wMSIpLmVxdWFscygiMTExMSIpOwotCQlib29sZWFuIHZhbHVlNiA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wMiIpLmVxdWFscygiMjIyMiIpOwotCQlib29sZWFuIHZhbHVlNyA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wMyIpLmVxdWFscygiMzMzMyIpOwotCQlib29sZWFuIHZhbHVlOCA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjJQcm9wNCIpLmVxdWFscygiNDQ0NCIpOwotCi0JCXJldHVybiBjb250YWluc01vZGVsMSAmJiBjb250YWluc01vZGVsMiAmJiBwcm9wMSAmJiBwcm9wMiAmJiBwcm9wMyAmJiBwcm9wNCAmJiBwcm9wNSAmJiBwcm9wNiAmJiBwcm9wNyAmJiBwcm9wOCAmJiB2YWx1ZTEgJiYgdmFsdWUyICYmIHZhbHVlMyAmJiB2YWx1ZTQgJiYgdmFsdWU1ICYmIHZhbHVlNiAmJiB2YWx1ZTcgJiYgdmFsdWU4OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9DLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjk3NTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9DLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQyBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYWQyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEQgZXh0ZW5kcyBCYXNlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9FLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGM2NzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBFIGV4dGVuZHMgQmFzZU9wZXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9GLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIzMjhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9GLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRiBleHRlbmRzIEJhc2VPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL0cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4YTQwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvRy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkubWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEcgZXh0ZW5kcyBCYXNlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RFeHRlbmRlZFByb3ZpZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEV4dGVuZGVkUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxMGUzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEV4dGVuZGVkUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS5tYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RXh0ZW5kZWRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIKLXsKLSAgcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCl7Ci0gICAgU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0gICAgcHJvcGVydHlOYW1lcy5hZGQoImV4ZWN1dGVkT3BzIik7Ci0gICAgcHJvcGVydHlOYW1lcy5hZGQoImV4ZWN1dGVkVW5kb09wcyIpOwotICAgIAotICAgIHJldHVybiBwcm9wZXJ0eU5hbWVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKQotICB7Ci0gICAgcmV0dXJuICJUZXN0RXh0ZW5kZWRQcm92aWRlciI7Ci0gIH0KLSAgCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9UZXN0R3JvdXBNYW5hZ2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdEdyb3VwTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQzZGViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvbWFuYWdlci9UZXN0R3JvdXBNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuRGF0YU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLkRhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5JRE1QYWdlR3JvdXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuSURNUGFnZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlBhZ2VHcm91cE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0R3JvdXBNYW5hZ2VyIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24gcm9vdE9wZXJhdGlvbjsKLQotCXByaXZhdGUgUGFnZUdyb3VwTWFuYWdlciBwYWdlR3JvdXBNYW5hZ2VyOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnQTsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0I7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdDOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnRDsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0U7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdGOwotCXByaXZhdGUgU2ltcGxlUGFnZUdyb3VwIHBnRzsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCBwZ0g7Ci0JcHJpdmF0ZSBTaW1wbGVQYWdlR3JvdXAgcGdSb290OwotCXByaXZhdGUgV2l6YXJkUGFnZSByMTsKLQlwcml2YXRlIFdpemFyZFBhZ2UgYjE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGIyOwotCXByaXZhdGUgV2l6YXJkUGFnZSBjMTsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZDE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGQyOwotCXByaXZhdGUgV2l6YXJkUGFnZSBkMzsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZjE7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGYyOwotCXByaXZhdGUgV2l6YXJkUGFnZSBmMzsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZjQ7Ci0JcHJpdmF0ZSBXaXphcmRQYWdlIGY1OwotCXByaXZhdGUgV2l6YXJkUGFnZSBmNjsKLQlwcml2YXRlIFdpemFyZFBhZ2UgZzE7Ci0KLQlwcml2YXRlIEFHcm91cEhhbmRsZXIgYUdyb3VwSGFuZGxlcjsKLQlwcml2YXRlIEZHcm91cEhhbmRsZXIgZkdyb3VwSGFuZGxlcjsKLQlwcml2YXRlIFZlY3RvciBleHBlY3RlZE9wczsKLQlwcml2YXRlIFZlY3RvciBleHBlY3RlZFVuZG9PcHM7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGEgPSBBLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBiID0gQi5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYyA9IEMuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGQgPSBELmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlID0gRS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZiA9IEYuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGcgPSBHLmNsYXNzLmdldE5hbWUoKTsKLQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJQmFzZU9wZXJhdGlvbi5yZXN1bHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCQlCYXNlT3BlcmF0aW9uLnVuZG9MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCWV4cGVjdGVkT3BzID0gbmV3IFZlY3RvcigpOwotCQlleHBlY3RlZFVuZG9PcHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWRhdGFNb2RlbCA9IG5ldyBEYXRhTW9kZWxJbXBsKG5ldyBFbXB0eVByb3ZpZGVyKCkpOwotCQlkYXRhTW9kZWwuYWRkTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjEiLCBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVGVzdFByb3ZpZGVyMSgpKSk7Ci0JCWRhdGFNb2RlbC5hZGROZXN0ZWRNb2RlbCgidGVzdHByb3ZpZGVyMiIsIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0UHJvdmlkZXIyKCkpKTsKLQkJZGF0YU1vZGVsLmFkZE5lc3RlZE1vZGVsKCJ0ZXN0ZXh0ZW5kZWRwcm92aWRlciIsIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0RXh0ZW5kZWRQcm92aWRlcigpKSk7Ci0KLQkJLyoqCi0JCSAqIE9wZXJhdGlvbnMgYXJlIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiA8Y29kZT4KLQkJICoJICAgIEQKLQkJICogICAgIC8gXAotCQkgKiAgICAvICAgXAotCQkgKiAgIEIgICAgIEYKLQkJICogIC8gXCAgIC8gXAotCQkgKiBBICAgQyBFICAgRwotCQkgKiA8L2NvZGU+Ci0JCSAqLwotCQlyb290T3BlcmF0aW9uID0gbmV3IERhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uSW1wbChuZXcgRCgpKTsKLQkJcm9vdE9wZXJhdGlvbi5zZXREYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQkJcm9vdE9wZXJhdGlvbi5zZXRFbnZpcm9ubWVudChFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpKTsKLQotCQkvKioKLQkJICogUGFnZSBncm91cHMgYXJlIG9yZ2FuaXplZCBhcyBmb2xsb3dzOgotCQkgKiAKLQkJICogPGNvZGU+Ci0JCSAqCi0JCSAqICAgICAgICAgICAgICBCIC0gQwotCQkgKiAgICAgICAgICAgICAvICAgICBcCi0JCSAqIFJvb3QgLSBBIC0gRCAgICAgICBcICAgICAgICAgRwotCQkgKiAgICAgICAgICAgICBcICAgICAgIFwgICAgICAvCi0JCSAqICAgICAgICAgICAgICAgLS0tLS0tIEUgLSBGIC0gSAotCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIG51bGwKLQkJICogPC9jb2RlPgotCQkgKi8KLQotCQkvLyBUaGUgcGFnZSBncm91cCBoYW5kbGVyIGZvciBBIHdpbGwgcmV0dXJuIGVpdGhlciBCIGFuZCB0aGVuIEUgb3IgRCBhbmQKLQkJLy8gdGhlbiBFLiBUaGUgZ3JvdXAgaGFuZGxlciBmb3IgRiB3aWxsIHJldHVybiBlaXRoZXIgRyBvciBIIGFuZCB0aGVuIG51bGwgb3IKLQkJLy8ganVzdCBudWxsLgotCQkvLyAKLQkJLy8gU29tZSBvZiB0aGVzZSBncm91cCByZXF1aXJlIG9wZXJhdGlvbnMgdG8gcnVuIGZpcnN0OgotCQkvLwotCQkvLyBQYWdlIGdyb3VwIEIgcmVxdWlyZXMgb3BlcmF0aW9uIEMuCi0JCS8vIFBhZ2UgZ3JvdXAgRCByZXF1aXJlcyBvcGVyYXRpb24gQy4KLQkJLy8gUGFnZSBncm91cCBFIHJlcXVpcmVzIG9wZXJhdGlvbiBFLgotCQkvLyBQYWdlIGdyb3VwIEYgcmVxdWlyZXMgb3BlcmF0aW9uIEMuKCBDIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gcnVuIGFuZCBzaG91bGQgbm90IGJlCi0JCS8vIHJlcnVuLikKLQkJLy8KLQkJLy8gRWFjaCBwYWdlIGdyb3VwIGhhcyBzb21lIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcyBmb2xsb3dzOgotCQkvLwotCQkvLyBSb290IGhhcyBwYWdlIHIxLgotCQkvLyBBIGhhcyBubyBwYWdlcy4KLQkJLy8gQiBoYXMgYjEgYW5kIGIyLgotCQkvLyBDIGhhcyBjMQotCQkvLyBEIGhhcyBkMSwgZDIsIGFuZCBkMwotCQkvLyBFIGhhcyBubyBwYWdlcy4KLQkJLy8gRiBoYXMgcGFnZXMgZjEsIGYyLCBmMywgZjQsIGY1LCBmNgotCQkvLyB0aGUgcGFnZSBoYW5kbGVyIGZvciBGIHdpbGwgcmV0dXJuIHRoZSBmb2xsb3dpbmc6Ci0JCS8vIGV4cGVjdGVkID0gZjEgcmV0dXJucyBmMQotCQkvLyBleHBlY3RlZCA9IGYyIHJldHVybnMgc2tpcAotCQkvLyBleHBlY3RlZCA9IGYzIHJldHVybnMgYmVmb3JlIGY2Ci0JCS8vIGV4cGVjdGVkID0gZjQgcmV0dXJucyBudWxsCi0JCS8vIGV4cGVjdGVkID0gZjUgcmV0dXJucyBhZnRlciBmNQotCQkvLyBleHBlY3RlZCA9IGY2IHJldHVybnMgZjQKLQkJLy8gRyBoYXMgcGFnZXMgZzEKLQkJLy8gSCBoYXMgbm8gcGFnZXMuCi0JCXIxID0gbmV3IFdpemFyZFBhZ2UoInIxIik7IC8vJE5PTi1OTFMtMSQKLQkJYjEgPSBuZXcgV2l6YXJkUGFnZSgiYjEiKTsgLy8kTk9OLU5MUy0xJAotCQliMiA9IG5ldyBXaXphcmRQYWdlKCJiMiIpOyAvLyROT04tTkxTLTEkCi0JCWMxID0gbmV3IFdpemFyZFBhZ2UoImMxIik7IC8vJE5PTi1OTFMtMSQKLQkJZDEgPSBuZXcgV2l6YXJkUGFnZSgiZDEiKTsgLy8kTk9OLU5MUy0xJAotCQlkMiA9IG5ldyBXaXphcmRQYWdlKCJkMiIpOyAvLyROT04tTkxTLTEkCi0JCWQzID0gbmV3IFdpemFyZFBhZ2UoImQzIik7IC8vJE5PTi1OTFMtMSQKLQkJZjEgPSBuZXcgV2l6YXJkUGFnZSgiZjEiKTsgLy8kTk9OLU5MUy0xJAotCQlmMiA9IG5ldyBXaXphcmRQYWdlKCJmMiIpOyAvLyROT04tTkxTLTEkCi0JCWYzID0gbmV3IFdpemFyZFBhZ2UoImYzIik7IC8vJE5PTi1OTFMtMSQKLQkJZjQgPSBuZXcgV2l6YXJkUGFnZSgiZjQiKTsgLy8kTk9OLU5MUy0xJAotCQlmNSA9IG5ldyBXaXphcmRQYWdlKCJmNSIpOyAvLyROT04tTkxTLTEkCi0JCWY2ID0gbmV3IFdpemFyZFBhZ2UoImY2Iik7IC8vJE5PTi1OTFMtMSQKLQkJZzEgPSBuZXcgV2l6YXJkUGFnZSgiZzEiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyB3aXphcmRJRCA9ICJ0ZXN0V2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JCXBnUm9vdCA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIlJvb3QiLCB3aXphcmRJRCk7IC8vJE5PTi1OTFMtMSQKLQkJcGdBID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiQSIsIHdpemFyZElEKTsgLy8kTk9OLU5MUy0xJAotCQlwZ0IgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJCIiwgd2l6YXJkSUQsIHRydWUsIGMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGdDID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiQyIsIHdpemFyZElEKTsgLy8kTk9OLU5MUy0xJAotCQlwZ0QgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJEIiwgd2l6YXJkSUQsIHRydWUsIGMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGdFID0gbmV3IFNpbXBsZVBhZ2VHcm91cCgiRSIsIHdpemFyZElELCB0cnVlLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBnRiA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIkYiLCB3aXphcmRJRCwgdHJ1ZSwgYyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwZ0cgPSBuZXcgU2ltcGxlUGFnZUdyb3VwKCJHIiwgd2l6YXJkSUQpOyAvLyROT04tTkxTLTEkCi0JCXBnSCA9IG5ldyBTaW1wbGVQYWdlR3JvdXAoIkgiLCB3aXphcmRJRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlwZ1Jvb3QuYWRkUGFnZXMobmV3IFdpemFyZFBhZ2VbXXtyMX0pOwotCQlwZ0IuYWRkUGFnZXMobmV3IFdpemFyZFBhZ2VbXXtiMSwgYjJ9KTsKLQkJcGdDLmFkZFBhZ2VzKG5ldyBXaXphcmRQYWdlW117YzF9KTsKLQkJcGdELmFkZFBhZ2VzKG5ldyBXaXphcmRQYWdlW117ZDEsIGQyLCBkM30pOwotCQlwZ0YuYWRkUGFnZXMobmV3IFdpemFyZFBhZ2VbXXtmMSwgZjIsIGYzLCBmNCwgZjUsIGY2fSk7Ci0JCXBnRy5hZGRQYWdlcyhuZXcgV2l6YXJkUGFnZVtde2cxfSk7Ci0KLQkJcGdGLnNldFBhZ2VIYW5kbGVyKG5ldyBGUGFnZUhhbmRsZXIoKSk7Ci0KLQkJYUdyb3VwSGFuZGxlciA9IG5ldyBBR3JvdXBIYW5kbGVyKCk7Ci0JCWZHcm91cEhhbmRsZXIgPSBuZXcgRkdyb3VwSGFuZGxlcigpOwotCi0JCXBnQS5zZXRQYWdlR3JvdXBIYW5kbGVyKGFHcm91cEhhbmRsZXIpOwotCQlwZ0Yuc2V0UGFnZUdyb3VwSGFuZGxlcihmR3JvdXBIYW5kbGVyKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyID0gbmV3IFBhZ2VHcm91cE1hbmFnZXIocm9vdE9wZXJhdGlvbiwgcGdSb290KTsKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJSb290IiwgcGdBKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkEiLCBwZ0IpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIuYWRkR3JvdXBBZnRlcigiQSIsIHBnRCk7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJBIiwgcGdFKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkIiLCBwZ0MpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIuYWRkR3JvdXBBZnRlcigiRSIsIHBnRik7IC8vJE5PTi1OTFMtMSQKLQkJcGFnZUdyb3VwTWFuYWdlci5hZGRHcm91cEFmdGVyKCJGIiwgcGdHKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIoIkYiLCBwZ0gpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQlIYXNoU2V0IGlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlkcy5hZGQoInRlc3Rwcm92aWRlcjEiKTsKLQkJaWRzLmFkZCgidGVzdHByb3ZpZGVyMiIpOwotCQlwZ0Euc2V0RGF0YU1vZGVsSURzKGlkcyk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJvb3QgcGFnZSBzaG91bGQgYmUgbnVsbCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOyAvLyBTaG91bGQgZG8gbm90aGluZy4KLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYUdyb3VwSGFuZGxlci5zZXRHcm91cElEVG9TZWxlY3QoIkIiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSByMSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSByMSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0JCWFzc2VydFRydWUoIkRhdGEgbW9kZWxzIG5vdCBPayBmb3IgcGFnZSBncm91cCBBIiwgY2hlY2tEYXRhTW9kZWxzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgYjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gYjEpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkT3BzLmFkZChhKTsKLQkJZXhwZWN0ZWRPcHMuYWRkKGIpOwotCQlleHBlY3RlZE9wcy5hZGQoYyk7Ci0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGIyIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGIyKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBjMSIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjMSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjEpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkT3BzLmFkZChkKTsKLQkJZXhwZWN0ZWRPcHMuYWRkKGUpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmMyIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmMyk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjUiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjUpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY2IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY2KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlmR3JvdXBIYW5kbGVyLnNldEdyb3VwSURUb1NlbGVjdCgiRyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY0KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRGYWxzZSgiVGhlcmUgc2hvdWxkIG5vdCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGcxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGcxKTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjYpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY1KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNCIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmMyk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjEpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY0IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGMxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5zZXRTaXplKDMpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGUpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGQpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVCYWNrT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBiMiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBiMik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlQmFja09uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgYjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gYjEpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUJhY2tPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJvb3QgcGFnZSBzaG91bGQgYmUgcjEiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gcjEpOyAvLyROT04tTkxTLTEkCi0JCWV4cGVjdGVkT3BzID0gbmV3IFZlY3RvcigpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGMpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGIpOwotCQlleHBlY3RlZFVuZG9PcHMuYWRkKGEpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlyZXNldCgpOwotCQlhR3JvdXBIYW5kbGVyLnNldEdyb3VwSURUb1NlbGVjdCgiRCIpOyAvLyROT04tTkxTLTEkCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGQxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGQxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5hZGQoYSk7Ci0JCWV4cGVjdGVkT3BzLmFkZChiKTsKLQkJZXhwZWN0ZWRPcHMuYWRkKGMpOwotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBkMiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBkMik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZDMiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZDMpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGYxIiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGYxKTsgLy8kTk9OLU5MUy0xJAotCQlleHBlY3RlZE9wcy5hZGQoZCk7Ci0JCWV4cGVjdGVkT3BzLmFkZChlKTsKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjMiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjMpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCi0JCXBhZ2VHcm91cE1hbmFnZXIubW92ZUZvcndhcmRPbmVQYWdlKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhIG5leHQgcGFnZSIsIHBhZ2VHcm91cE1hbmFnZXIuaGFzTmV4dFBhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHBhZ2Ugc2hvdWxkIGJlIGY1IiwgcGFnZUdyb3VwTWFuYWdlci5nZXRDdXJyZW50UGFnZSgpID09IGY1KTsgLy8kTk9OLU5MUy0xJAotCQljaGVja1Jlc3VsdHMoKTsKLQotCQlwYWdlR3JvdXBNYW5hZ2VyLm1vdmVGb3J3YXJkT25lUGFnZSgpOwotCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgYSBuZXh0IHBhZ2UiLCBwYWdlR3JvdXBNYW5hZ2VyLmhhc05leHRQYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSBwYWdlIHNob3VsZCBiZSBmNiIsIHBhZ2VHcm91cE1hbmFnZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBmNik7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tSZXN1bHRzKCk7Ci0KLQkJcGFnZUdyb3VwTWFuYWdlci5tb3ZlRm9yd2FyZE9uZVBhZ2UoKTsKLQkJZkdyb3VwSGFuZGxlci5zZXRHcm91cElEVG9TZWxlY3QobnVsbCk7Ci0JCWFzc2VydEZhbHNlKCJUaGVyZSBzaG91bGQgbm90IGJlIGEgbmV4dCBwYWdlIiwgcGFnZUdyb3VwTWFuYWdlci5oYXNOZXh0UGFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJUaGUgcGFnZSBzaG91bGQgYmUgZjQiLCBwYWdlR3JvdXBNYW5hZ2VyLmdldEN1cnJlbnRQYWdlKCkgPT0gZjQpOyAvLyROT04tTkxTLTEkCi0JCWNoZWNrUmVzdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1Jlc3VsdHMoKSB7Ci0JCWFzc2VydFRydWUoIkV4cGVjdGVkPSIgKyBleHBlY3RlZE9wcy5zaXplKCkgKyAiIGV4ZWN1dGVkPSIgKyBCYXNlT3BlcmF0aW9uLnJlc3VsdExpc3Quc2l6ZSgpLCBCYXNlT3BlcmF0aW9uLnJlc3VsdExpc3Quc2l6ZSgpID09IGV4cGVjdGVkT3BzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBCYXNlT3BlcmF0aW9uLnJlc3VsdExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRPcHMuZWxlbWVudEF0KGluZGV4KSwgQmFzZU9wZXJhdGlvbi5yZXN1bHRMaXN0LmVsZW1lbnRBdChpbmRleCkpOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgdW5kbz0iICsgZXhwZWN0ZWRVbmRvT3BzLnNpemUoKSArICIgZXhlY3V0ZWQ9IiArIEJhc2VPcGVyYXRpb24udW5kb0xpc3Quc2l6ZSgpLCBCYXNlT3BlcmF0aW9uLnVuZG9MaXN0LnNpemUoKSA9PSBleHBlY3RlZFVuZG9PcHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IEJhc2VPcGVyYXRpb24udW5kb0xpc3Quc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRVbmRvT3BzLmVsZW1lbnRBdChpbmRleCksIEJhc2VPcGVyYXRpb24udW5kb0xpc3QuZWxlbWVudEF0KGluZGV4KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCUJhc2VPcGVyYXRpb24ucmVzdWx0TGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlleHBlY3RlZE9wcy5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlCYXNlT3BlcmF0aW9uLnVuZG9MaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JCWV4cGVjdGVkVW5kb09wcy5yZW1vdmVBbGxFbGVtZW50cygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0RhdGFNb2RlbHMoKSB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBkYXRhTW9kZWw7Ci0KLQkJYm9vbGVhbiBjb250YWluc01vZGVsMSA9IG1vZGVsLmlzTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjEiKTsKLQkJYm9vbGVhbiBjb250YWluc01vZGVsMiA9IG1vZGVsLmlzTmVzdGVkTW9kZWwoInRlc3Rwcm92aWRlcjIiKTsKLQkJYm9vbGVhbiBwcm9wMSA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3AxIik7Ci0JCWJvb2xlYW4gcHJvcDIgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjFQcm9wMiIpOwotCQlib29sZWFuIHByb3AzID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIxUHJvcDMiKTsKLQkJYm9vbGVhbiBwcm9wNCA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMVByb3A0Iik7Ci0JCWJvb2xlYW4gcHJvcDUgPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wMSIpOwotCQlib29sZWFuIHByb3A2ID0gbW9kZWwuaXNQcm9wZXJ0eVNldCgicHJvdmlkZXIyUHJvcDIiKTsKLQkJYm9vbGVhbiBwcm9wNyA9IG1vZGVsLmlzUHJvcGVydHlTZXQoInByb3ZpZGVyMlByb3AzIik7Ci0JCWJvb2xlYW4gcHJvcDggPSBtb2RlbC5pc1Byb3BlcnR5U2V0KCJwcm92aWRlcjJQcm9wNCIpOwotCQlib29sZWFuIHZhbHVlMSA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wMSIpLmVxdWFscygiMTEiKTsKLQkJYm9vbGVhbiB2YWx1ZTIgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIxUHJvcDIiKS5lcXVhbHMoIjIyIik7Ci0JCWJvb2xlYW4gdmFsdWUzID0gbW9kZWwuZ2V0UHJvcGVydHkoInByb3ZpZGVyMVByb3AzIikuZXF1YWxzKCIzMyIpOwotCQlib29sZWFuIHZhbHVlNCA9IG1vZGVsLmdldFByb3BlcnR5KCJwcm92aWRlcjFQcm9wNCIpLmVxdWFscygiNDQiKTsKLQkJYm9vbGVhbiB2YWx1ZTUgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDEiKS5lcXVhbHMoIjExMTEiKTsKLQkJYm9vbGVhbiB2YWx1ZTYgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDIiKS5lcXVhbHMoIjIyMjIiKTsKLQkJYm9vbGVhbiB2YWx1ZTcgPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDMiKS5lcXVhbHMoIjMzMzMiKTsKLQkJYm9vbGVhbiB2YWx1ZTggPSBtb2RlbC5nZXRQcm9wZXJ0eSgicHJvdmlkZXIyUHJvcDQiKS5lcXVhbHMoIjQ0NDQiKTsKLQotCQlyZXR1cm4gY29udGFpbnNNb2RlbDEgJiYgY29udGFpbnNNb2RlbDIgJiYgcHJvcDEgJiYgcHJvcDIgJiYgcHJvcDMgJiYgcHJvcDQgJiYgcHJvcDUgJiYgcHJvcDYgJiYgcHJvcDcgJiYgcHJvcDggJiYgdmFsdWUxICYmIHZhbHVlMiAmJiB2YWx1ZTMgJiYgdmFsdWU0ICYmIHZhbHVlNSAmJiB2YWx1ZTYgJiYgdmFsdWU3ICYmIHZhbHVlODsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEFHcm91cEhhbmRsZXIgaW1wbGVtZW50cyBJRE1QYWdlR3JvdXBIYW5kbGVyIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZ3JvdXBJRF87Ci0KLQkJcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBjdXJyZW50UGFnZUdyb3VwSUQsIFN0cmluZ1tdIHBhZ2VHcm91cElEcykgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJCWlmIChjdXJyZW50UGFnZUdyb3VwSUQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGdyb3VwSURfOwotCQkJfSBlbHNlIGlmIChjdXJyZW50UGFnZUdyb3VwSUQuZXF1YWxzKCJFIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9ICJFIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0R3JvdXBJRFRvU2VsZWN0KFN0cmluZyBpZCkgewotCQkJZ3JvdXBJRF8gPSBpZDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRkdyb3VwSGFuZGxlciBpbXBsZW1lbnRzIElETVBhZ2VHcm91cEhhbmRsZXIgewotCQlwcml2YXRlIFN0cmluZyBncm91cElEXzsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5leHRQYWdlR3JvdXAoU3RyaW5nIGN1cnJlbnRQYWdlR3JvdXBJRCwgU3RyaW5nW10gcGFnZUdyb3VwSURzKSB7Ci0JCQlpZiAoY3VycmVudFBhZ2VHcm91cElEID09IG51bGwpCi0JCQkJcmV0dXJuIGdyb3VwSURfOwotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEdyb3VwSURUb1NlbGVjdChTdHJpbmcgaWQpIHsKLQkJCWdyb3VwSURfID0gaWQ7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIEYgaGFzIHBhZ2VzIGYxLCBmMiwgZjMsIGY0LCBmNSwgZjYKLQkvLyB0aGUgcGFnZSBoYW5kbGVyIGZvciBGIHdpbGwgcmV0dXJuIHRoZSBmb2xsb3dpbmc6Ci0JLy8gZXhwZWN0ZWQgPSBmMSByZXR1cm5zIGYxCi0JLy8gZXhwZWN0ZWQgPSBmMiByZXR1cm5zIHNraXAKLQkvLyBleHBlY3RlZCA9IGYzIHJldHVybnMgYmVmb3JlIGY2Ci0JLy8gZXhwZWN0ZWQgPSBmNCByZXR1cm5zIG51bGwKLQkvLyBleHBlY3RlZCA9IGY1IHJldHVybnMgYWZ0ZXIgZjUKLQkvLyBleHBlY3RlZCA9IGY2IHJldHVybnMgZjQKLQkvLwotCS8vIFRoaXMgaGFuZGxlIHNob3VsZCBjYXVzZSB0aGUgZm9sbG93aW5nIHBhZ2VzIHRvIGJlIHVzZWQuCi0JLy8gZjEsIGYzLCBmNSwgZjYsIGY0LCBudWxsCi0JLy8KLQlwcml2YXRlIGNsYXNzIEZQYWdlSGFuZGxlciBpbXBsZW1lbnRzIElETVBhZ2VIYW5kbGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXROZXh0UGFnZShTdHJpbmcgY3VycmVudFBhZ2VOYW1lLCBTdHJpbmcgZXhwZWN0ZWROZXh0UGFnZU5hbWUpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCQlpZiAoY3VycmVudFBhZ2VOYW1lID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSAiZjEiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImYxIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IElETVBhZ2VIYW5kbGVyLlNLSVBfUEFHRTsKLQkJCX0gZWxzZSBpZiAoY3VycmVudFBhZ2VOYW1lLmVxdWFscygiZjMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gSURNUGFnZUhhbmRsZXIuUEFHRV9CRUZPUkUgKyAiZjYiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImY0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImY1IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IElETVBhZ2VIYW5kbGVyLlBBR0VfQUZURVIgKyAiZjUiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGN1cnJlbnRQYWdlTmFtZS5lcXVhbHMoImY2IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9ICJmNCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJldmlvdXNQYWdlKFN0cmluZyBjdXJyZW50UGFnZU5hbWUsIFN0cmluZyBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWUpIHsKLQkJCXJldHVybiBleHBlY3RlZFByZXZpb3VzUGFnZU5hbWU7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgRW1wdHlQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgSGFzaFNldCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBXaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JCXByaXZhdGUgYm9vbGVhbiBjYW5GaW5pc2hfID0gdHJ1ZTsKLQotCQlwdWJsaWMgV2l6YXJkUGFnZShTdHJpbmcgaWQpIHsKLQkJCXN1cGVyKGRhdGFNb2RlbCwgaWQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Q2FuRmluaXNoKGJvb2xlYW4gY2FuRmluaXNoKSB7Ci0JCQljYW5GaW5pc2hfID0gY2FuRmluaXNoOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuUGFnZUZpbmlzaCgpIHsKLQkJCXJldHVybiBjYW5GaW5pc2hfOwotCQl9Ci0KLQkJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2YjAyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm92aWRlcjEgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCi17Ci0gIHB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpewotICAgIFNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wMSIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wMiIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wMyIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjFQcm9wNCIpOwotICAgIAotICAgIHJldHVybiBwcm9wZXJ0eU5hbWVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMVByb3AxIiwgIjExIiApOwotICAgIHNldFByb3BlcnR5KCAicHJvdmlkZXIxUHJvcDIiLCAiMjIiICk7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjFQcm9wMyIsICIzMyIgKTsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMVByb3A0IiwgIjQ0IiApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJRCgpCi0gIHsKLSAgICByZXR1cm4gInRlc3Rwcm92aWRlcjEiOwotICB9Ci0gIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS9tYW5hZ2VyL1Rlc3RQcm92aWRlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwMTQ5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL21hbmFnZXIvVGVzdFByb3ZpZGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLm1hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm92aWRlcjIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyCi17Ci0gIHB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpewotICAgIFNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wMSIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wMiIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wMyIpOwotICAgIHByb3BlcnR5TmFtZXMuYWRkKCJwcm92aWRlcjJQcm9wNCIpOwotICAgIAotICAgIHJldHVybiBwcm9wZXJ0eU5hbWVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMlByb3AxIiwgIjExMTEiICk7Ci0gICAgc2V0UHJvcGVydHkoICJwcm92aWRlcjJQcm9wMiIsICIyMjIyIiApOwotICAgIHNldFByb3BlcnR5KCAicHJvdmlkZXIyUHJvcDMiLCAiMzMzMyIgKTsKLSAgICBzZXRQcm9wZXJ0eSggInByb3ZpZGVyMlByb3A0IiwgIjQ0NDQiICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKQotICB7Ci0gICAgcmV0dXJuICJ0ZXN0cHJvdmlkZXIyIjsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxOWQ0OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ViNmU2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkFkZGFibGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5TaW1wbGVQYWdlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLlNpbXBsZVBhZ2VHcm91cEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFdpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0MkRhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFkZGFibGVQYWdlR3JvdXAgY3JlYXRlUm9vdFBhZ2VHcm91cCgpIHsKLQkJU2ltcGxlUGFnZUdyb3VwIHBnID0gKFNpbXBsZVBhZ2VHcm91cCkgc3VwZXIuY3JlYXRlUm9vdFBhZ2VHcm91cCgpOwotCQlwZy5zZXRQYWdlR3JvdXBIYW5kbGVyKG5ldyBTaW1wbGVQYWdlR3JvdXBIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXROZXh0UGFnZUdyb3VwKFN0cmluZyBjdXJyZW50UGFnZUdyb3VwSUQsIFN0cmluZ1tdIHBhZ2VHcm91cElEcykgewotCQkJCWlmIChjdXJyZW50UGFnZUdyb3VwSUQgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VHcm91cElEcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHBhZ2VHcm91cElEc1tpXS5lcXVhbHMoImJhciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gImJhciI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2VHcm91cChjdXJyZW50UGFnZUdyb3VwSUQsIHBhZ2VHcm91cElEcyk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcGc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE1ZDBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5ETVdpemFyZEV4dGVuc2lvbkZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkgZXh0ZW5kcyBETVdpemFyZEV4dGVuc2lvbkZhY3RvcnkgewotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlTmFtZSgpIHsKLQkJcmV0dXJuICJBIFBhZ2UiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXRQcm92aWRlcigpewotCQlyZXR1cm4gbmV3IFRlc3QyRGF0YU1vZGVsUHJvdmlkZXIoKXsKLQkJCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCQkJcmV0dXJuIG5ldyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbigpewotCQkJCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRQYWdlTmFtZSgpKTsJCi0JCQkJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIERhdGFNb2RlbFdpemFyZFBhZ2VbXSBjcmVhdGVQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlR3JvdXBJRCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFdpemFyZFBhZ2VbXXtuZXcgRGF0YU1vZGVsV2l6YXJkUGFnZShEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChnZXRQcm92aWRlcigpKSwgZ2V0UGFnZU5hbWUoKSkgewotCQkJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJCWxhYmVsLnNldFRleHQoZ2V0UGFnZU5hbWUoKSk7Ci0JCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJCX0KLQkJfX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzU4YTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5MiBleHRlbmRzIFRlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhZ2VOYW1lKCkgewotCQlyZXR1cm4gIkEgQmV0dGVyIFBhZ2UiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5My5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJEYXRhTW9kZWxXaXphcmRGYWN0b3J5My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTFlNDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotcHVibGljIGNsYXNzIFRlc3QyRGF0YU1vZGVsV2l6YXJkRmFjdG9yeTMgZXh0ZW5kcyBUZXN0MkRhdGFNb2RlbFdpemFyZEZhY3RvcnkgewotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYWdlTmFtZSgpIHsKLQkJcmV0dXJuICJBbm90aGVyIFBhZ2UsIGJ1dCBub3QgYmV0dGVyIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyUGFnZVdpemFyZEV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3QyUGFnZVdpemFyZEV4dGVuc2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyNzE3NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9udWkuRE1XaXphcmRQYWdlRXh0ZW5zaW9uRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRlc3QyUGFnZVdpemFyZEV4dGVuc2lvbkZhY3RvcnkgZXh0ZW5kcwotCQlETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5IHsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLAotCQkJU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCVN0cmluZyBsYWJlbE5hbWU7Ci0JCWlmICgiQSBCZXR0ZXIgUGFnZSIuZXF1YWxzKHBhZ2VOYW1lKSkgewotCQkJbGFiZWxOYW1lID0gIkFuIGFkZGl0b25hbCB0ZXh0IGJveCBmb3IgdGhlIGJldHRlciBwYWdlIjsKLQkJfSBlbHNlIGlmICgiQW5vdGhlciBQYWdlLCBidXQgbm90IGJldHRlciIuZXF1YWxzKHBhZ2VOYW1lKSkgewotCQkJbGFiZWxOYW1lID0gIkFuIGFkZGl0b25hbCB0ZXh0IGJveCBmb3IgdGhlIE5PVCBiZXR0ZXIgcGFnZSI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5Mi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMGIyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0MlBhZ2VXaXphcmRFeHRlbnNpb25GYWN0b3J5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5leHRlbnNpb251aS5ETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVGVzdDJQYWdlV2l6YXJkRXh0ZW5zaW9uRmFjdG9yeTIgZXh0ZW5kcwotCQlETVdpemFyZFBhZ2VFeHRlbnNpb25GYWN0b3J5IHsKLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLAotCQkJU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCWlmICgiQSBCZXR0ZXIgUGFnZSIuZXF1YWxzKHBhZ2VOYW1lKSkgewotCQkJQnV0dG9uIGNoZWNrYm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQljaGVja2JveC5zZXRUZXh0KCJBZGRpdGlvbmFsIGNoZWNrYm94IGZvciBhIGJldHRlciBwYWdlIik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjc0ZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciB7Ci0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuICJUZXN0V2l6YXJkSUQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcmVzdWx0LmFkZCgicHJvcDEiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYWRkKCJwcm9wMiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFRlc3RPcGVyYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0RGF0YVdpemFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdERhdGFXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U2ZGRlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0RGF0YVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuQWRkYWJsZVBhZ2VHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLlNpbXBsZVBhZ2VHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkuUGFnZUdyb3VwTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFRlc3REYXRhV2l6YXJkIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkIHsKLQlwcml2YXRlIFNpbXBsZVBhZ2VHcm91cCByb290OwotCi0JcHVibGljIFRlc3REYXRhV2l6YXJkKCkgewotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCVBhZ2VHcm91cE1hbmFnZXIgcGFnZU1hbmFnZXIgPSBnZXRQYWdlR3JvdXBNYW5hZ2VyKCk7Ci0JCXBhZ2VNYW5hZ2VyLmFkZEdyb3VwQWZ0ZXIocm9vdC5nZXRQYWdlR3JvdXBJRCgpLCBuZXcgVGVzdFBhZ2VHcm91cDIoZ2V0RGF0YU1vZGVsKCkpKTsKLQotCQlzdXBlci5kb0FkZFBhZ2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVzdERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFkZGFibGVQYWdlR3JvdXAgY3JlYXRlUm9vdFBhZ2VHcm91cCgpIHsKLQkJcm9vdCA9IG5ldyBUZXN0Um9vdFBhZ2VHcm91cChnZXREYXRhTW9kZWwoKSk7Ci0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y0YTM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JcHVibGljIFRlc3RPcGVyYXRpb24oKSB7Ci0JCXNldElEKCJUZXN0T3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbiBleGVjdXRlOiBkYXRhIG1vZGVsPSIgKyBnZXREYXRhTW9kZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIlRlc3Qgb3BlcmF0aW9uOiAiLCA1KTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaW5kZXggPSAxOyBpbmRleCA8IDY7IGluZGV4KyspIHsKLQkJCQltb25pdG9yLnN1YlRhc2soInBhcnQgIiArIGluZGV4ICsgIiBvZiA1IGNvbXBsZXRlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oImV4ZWN1dGUgdGhyZXcgYW5kIGV4Y2VwdGlvbiAiLCBleGMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5kbyB0ZXN0IG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2UxLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhNzFiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UGFnZTEgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQlwdWJsaWMgVGVzdFBhZ2UxKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwsICJQYWdlMSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKCJUaXRsZSBmb3IgdGVzdCBwYWdlMSIpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKCJEZXNjcmlwdGlvbiBmb3IgdGVzdCBwYWdlIDEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblBhZ2VGaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUJ1dHRvbiBidXR0b24xID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlBVU0gpOwotCQlCdXR0b24gYnV0dG9uMiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQotCQlidXR0b24xLnNldFRleHQoIkJ1dHRvbjEiKTsgLy8kTk9OLU5MUy0xJAotCQlidXR0b24yLnNldFRleHQoIkJ1dHRvbjIiKTsgLy8kTk9OLU5MUy0xJAotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXJldHVybiBncm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTYzZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFBhZ2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotCi1wdWJsaWMgY2xhc3MgVGVzdFBhZ2UyIGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JcHVibGljIFRlc3RQYWdlMihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsLCAiUGFnZTIiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZSgiVGl0bGUgZm9yIHRlc3QgcGFnZTIiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbigiRGVzY3JpcHRpb24gZm9yIHRlc3QgcGFnZSAyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYWdlRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlCdXR0b24gYnV0dG9uMSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJQnV0dG9uIGJ1dHRvbjIgPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0KLQkJYnV0dG9uMS5zZXRUZXh0KCJQYWdlIDIgYnV0dG9uMSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1dHRvbjIuc2V0VGV4dCgiUGFnZSAyIGJ1dHRvbjIiKTsgLy8kTk9OLU5MUy0xJAotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXJldHVybiBncm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlR3JvdXAyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0UGFnZUdyb3VwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGE4MzU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RQYWdlR3JvdXAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLlNpbXBsZVBhZ2VHcm91cDsKLQotcHVibGljIGNsYXNzIFRlc3RQYWdlR3JvdXAyIGV4dGVuZHMgU2ltcGxlUGFnZUdyb3VwIHsKLQlwcml2YXRlIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCi0JcHVibGljIFRlc3RQYWdlR3JvdXAyKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKCJncm91cDIiLCBkYXRhTW9kZWwuZ2V0SUQoKSwgdHJ1ZSwgIlRlc3RPcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCi0JCWFkZFBhZ2VzKG5ldyBJV2l6YXJkUGFnZVtde25ldyBUZXN0UGFnZTIodGhpcy5kYXRhTW9kZWwpfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFJvb3RQYWdlR3JvdXAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RSb290UGFnZUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjg1YjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy91aS93aXphcmQvVGVzdFJvb3RQYWdlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuU2ltcGxlUGFnZUdyb3VwOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJvb3RQYWdlR3JvdXAgZXh0ZW5kcyBTaW1wbGVQYWdlR3JvdXAgewotCXByaXZhdGUgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0KLQlwdWJsaWMgVGVzdFJvb3RQYWdlR3JvdXAoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsLmdldElEKCksIGRhdGFNb2RlbC5nZXRJRCgpKTsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0KLQkJYWRkUGFnZXMobmV3IElXaXphcmRQYWdlW117bmV3IFRlc3RQYWdlMSh0aGlzLmRhdGFNb2RlbCl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3VpL3dpemFyZC9UZXN0V2l6YXJkVGVzdGNhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RXaXphcmRUZXN0Y2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA1YTliLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdWkvd2l6YXJkL1Rlc3RXaXphcmRUZXN0Y2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RXaXphcmRUZXN0Y2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3REYXRhV2l6YXJkIHdpemFyZF87Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXdpemFyZF8gPSBuZXcgVGVzdERhdGFXaXphcmQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlV2l6YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKG51bGwsIHdpemFyZF8pOwotCi0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3QyRGF0YU1vZGVsV2l6YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKCBuZXcgUnVubmFibGUoKXsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhudWxsLCBuZXcgVGVzdDJEYXRhTW9kZWxXaXphcmQoKSk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjU1YzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2U0YjhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTYXQgTWFyIDI5IDA3OjUzOjMxIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1ZmVmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkLkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDMsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGIyZmM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjIyM2U0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQnVuZGxlLU5hbWUuMCA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIEd1YXJkIFRlc3QgY2FzZXMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZGFhMmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiCi0gICAgICAgICBpZD0iVDNBIiBuYW1lPSJUM0EiPgotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgYnVpbGQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC5UM0EiCi0gICAgICAgICAgICBtYW51YWw9ImZhbHNlIj4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIgotICAgICAgICAgaWQ9IlQzQiIgbmFtZT0iVDNCIj4KLSAgICAgIDx2YWxpZGF0b3IgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC5UM0IiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICAgICAgICAgIGlkPSJhLmJvZ3VzLmZhY2V0Ij4KLSAgICAgICAgICAgICAgIDwvZmFjZXQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9ndWFyZC9BY3RpdmF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTEyYWZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uZ3VhcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBwbHVnLWluIGlzIHRvIGVuc3VyZSB0aGF0IGl0IG5ldmVyIGdldHMgbG9hZGVkLiBJZiBpdCBkb2VzIGl0IG1lYW5zIHRoYXQgd2UgYXJlCi0gKiBhY3RpdmF0aW5nIHZhbGlkYXRvcnMgdG9vIGVhcmx5LgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZCI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZhdG9yIHBsdWdpbjsKLQkKLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCQlSdW50aW1lRXhjZXB0aW9uIHJlID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgcGx1Zy1pbiBzaG91bGQgbmV2ZXIgYmUgbG9hZGVkLiBJZiBpdCBpcyBpdCBtZWFucyB0aGF0IHdlIGFyZSBsb2FkaW5nICIgKwotCQkJInZhbGlkYXRvcnMgdG9vIGVhcmx5LCBhbmQgY2F1c2luZyB1bm5lY2Nlc3NhcnkgcGx1Zy1pbiBhY3RpdmF0aW9uLiIpOwotCQloYW5kbGVFeGNlcHRpb24ocmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogV3JpdGUgdGhpcyBleGNlcHRpb24gdG8gdGhlIGxvZy4KLQkgKiA8cD4KLQkgKiBXZSBhcmUgaW4gdGhlIHRyYW5zaXRpb24gb2YgbW92aW5nIHRvIGEgbmV3IGFwcHJvYWNoIGZvciBsb2NhbGl6ZWQgbWVzc2FnZXMuIFRoaXMgaXMgdGhlIG5ldyAKLQkgKiBhcHByb2FjaCBmb3IgZXhjZXB0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZSB0aGUgdGhyb3dhYmxlLCB0aGlzIGNhbiBiZSBudWxsIGluIHdoaWNoIGNhc2UgaXQgaXMgYSBub3AuCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlKXsKLQkJaWYgKGUgPT0gbnVsbClyZXR1cm47Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOwotCQlnZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL1QzQS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvVDNBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDYxODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvVDNBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLQotLyoqCi0gKiBBIHRlc3QgdmFsaWRhdG9yIHRoYXQgd2UgbmV2ZXIgZXhwZWN0IHRvIGJlIGFjdGl2YXRlZC4gVGhlIHJlYXNvbiB3ZSBuZXZlciBleHBlY3QgaXQgdG8gYmUgdmFsaWRhdGVkIGlzIHRoYXQgYnkKLSAqIGRlZmF1bHQgaXQgaXMgdHVybmVkIG9mZi4gVGhlIHVzZXIgY2FuIHN0aWxsIGV4cGxpY2l0bHkgdHVybiBpdCBvbiwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIHJ1biwgYW5kIHRoYXQgd291bGQgbm90Ci0gKiBiZSBjb25zaWRlcmVkIGFuIGVycm9yLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFQzQSBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gX2ludm9rZWQ7Ci0JCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlpZiAoIV9pbnZva2VkKXsKLQkJCV9pbnZva2VkID0gdHJ1ZTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgVDNBIHZhbGlkYXRvciBzaG91bGQgbmV2ZXIgYmUgYWN0aXZhdGVkIG9yIGNhbGxlZC4gSWYgdGhpcyB2YWxpZGF0b3Igd2FzIG1hbnVhbGx5IHR1cm5lZCBvbiAiICsKLQkJCQkidGhvdWdoIHRoZSBwcmVmZXJlbmNlcywgdGhlbiB0aGlzIGlzIG5vdCBhIHJlYWwgZXJyb3IuIik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwkJCi0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy92YWxpZGF0aW9uL2d1YXJkL1QzQi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvVDNCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNjQ5YWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vZ3VhcmQvVDNCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5ndWFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLQotLyoqCi0gKiBBIHRlc3QgdmFsaWRhdG9yIHRoYXQgd2UgbmV2ZXIgZXhwZWN0IHRvIGJlIGFjdGl2YXRlZC4gVGhlIHJlYXNvbiB3ZSBuZXZlciBleHBlY3QgaXQgdG8gYmUgdmFsaWRhdGVkIGlzIHRoYXQgaXQgaGFzIGEgYm9ndXMgZmFjZXQgZmlsdGVyLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFQzQiBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gX2ludm9rZWQ7Ci0JCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlpZiAoIV9pbnZva2VkKXsKLQkJCV9pbnZva2VkID0gdHJ1ZTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgVDNCIHZhbGlkYXRvciBzaG91bGQgbmV2ZXIgYmUgYWN0aXZhdGVkIG9yIGNhbGxlZC4gSWYgdGhpcyB2YWxpZGF0b3Igd2FzIG1hbnVhbGx5IGNobmFnZWQgIiArCi0JCQkJInRob3VnaCB0aGUgcHJlZmVyZW5jZXMsIGFuZCB0aGUgYm9ndXMgZmlsdGVyIHdhcyByZW1vdmVkLCB0aGVuIHRoaXMgaXNuJ3QgYSByZWFsIGVycm9yLiIpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODlmNTIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2YWxpZGF0b3JzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWM3NWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTUyMDY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAyMCAwNzoyMzowMSBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz1fCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz1fCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTgyZDZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jU3VuIEFwciAyMCAwNzoyMzowMSBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCi1vcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIyNzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjIsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLnRlc3RjYXNlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzdhNDhjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICB2YWxpZGF0b3JzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlOThlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1CdW5kbGUtTmFtZS4wID0gVmFsaWRhdGlvbiBGcmFtZXdvcmsgVGVzdCBjYXNlcwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLQotVGVzdDEuVmFsaWRhdG9yLk5hbWU9VGVzdDEgVmFsaWRhdG9yCi1UZXN0Mi5WYWxpZGF0b3IuTmFtZT1UZXN0MiBWYWxpZGF0b3IKLVRlc3QzLlZhbGlkYXRvci5OYW1lPVRlc3QzIFZhbGlkYXRvcgotVGVzdDQuVmFsaWRhdG9yLk5hbWU9VGVzdDQgVmFsaWRhdG9yCi1UZXN0NS5WYWxpZGF0b3IuTmFtZT1UZXN0NSBWYWxpZGF0b3IKLVRlc3Q1RC5WYWxpZGF0b3IuTmFtZT1UZXN0NUQgVmFsaWRhdG9yCi1UZXN0Ni5WYWxpZGF0b3IuTmFtZT1UZXN0NiBWYWxpZGF0b3IKLVRlc3Q3LlZhbGlkYXRvci5OYW1lPVRlc3Q3IFZhbGlkYXRvcgotCi1NZXNzYWdlLmJhZD1SZWFsbHkgYmFkIHRoaW5ncwotTWVzc2FnZS5zb3J0b2Y9U29ydCBvZiBiYWQgdGhpbmdzCi1NZXNzYWdlLm5pY2U9TmljZSB0aGluZ3MKLU1lc3NhZ2UubG9uZz1BIGxpbmUgdGhhdCBpcyBhIGJpdCBsb25nLCBqdXN0IHRvIHNlZSBob3cgaXQgbG9va3MKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNWMxODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIgotICAgICAgICAgaWQ9IlRlc3QxIiBuYW1lPSIlVGVzdDEuVmFsaWRhdG9yLk5hbWUiPgotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgYnVpbGQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3RWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9ImZhbHNlIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0idGVzdDEiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiCi0gICAgICAgICBpZD0iVGVzdDIiIG5hbWU9IiVUZXN0Mi5WYWxpZGF0b3IuTmFtZSI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVGVzdFZhbGlkYXRvcjIiCi0gICAgICAgICAgICBtYW51YWw9ImZhbHNlIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlIG5hbWU9InNvbWVmaWxlLnR4dCIgdHlwZT0iZmlsZSIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNweCI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqYXZhIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBleHQ9InRlc3QyIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxwcm9qZWN0TmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5zYW1wbGUiIC8+Ci0gICAgICAgICAgICAgICA8ZmFjZXQgaWQ9ImNvbS5pYm0udmYudGVzdC5mYWNldDIiLz4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxjb250ZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0udmYudGVzdC5jb250ZW50VHlwZTIiPgotICAgICAgICAgICAgICAgPC9jb250ZW50VHlwZT4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8ZXhjbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53aWQuZmFjZXQiPgotICAgICAgICAgICAgICAgPC9mYWNldD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2V4Y2x1ZGU+ICAgICAgICAgCi0gICAgICAgICA8bWVzc2FnZUNhdGVnb3J5IGlkPSJiYWQiIGxhYmVsPSIlTWVzc2FnZS5iYWQiIHNldmVyaXR5PSJlcnJvciIvPgotICAgICAgICAgPG1lc3NhZ2VDYXRlZ29yeSBpZD0ic29ydG9mIiBsYWJlbD0iJU1lc3NhZ2Uuc29ydG9mIiBzZXZlcml0eT0id2FybmluZyIvPgotICAgICAgICAgPG1lc3NhZ2VDYXRlZ29yeSBpZD0ibmljZSIgbGFiZWw9IiVNZXNzYWdlLm5pY2UiIHNldmVyaXR5PSJpZ25vcmUiLz4KLSAgICAgICAgIDxtZXNzYWdlQ2F0ZWdvcnkgaWQ9ImxvbmciIGxhYmVsPSIlTWVzc2FnZS5sb25nIiBzZXZlcml0eT0iaWdub3JlIi8+Ci0gICAgICAgICAKLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiIKLSAgICAgICAgIGlkPSJUZXN0MyIgbmFtZT0iJVRlc3QzLlZhbGlkYXRvci5OYW1lIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UZXN0VmFsaWRhdG9yMyIKLSAgICAgICAgICAgIG1hbnVhbD0iZmFsc2UiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgZXh0PSJodG1sIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBleHQ9Imh0bSI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiIGlkPSJUZXN0NCIgbmFtZT0iJVRlc3Q0LlZhbGlkYXRvci5OYW1lIj4KLSAgICAgIDx2YWxpZGF0b3IgYnVpbGQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3RWYWxpZGF0b3I0IgotICAgICAgICAgICAgbWFudWFsPSJmYWxzZSI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBleHQ9InRlc3Q0Ij4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIGlkPSJUZXN0NSIgbmFtZT0iJVRlc3Q1LlZhbGlkYXRvci5OYW1lIiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiPgotICAgICAgPHZhbGlkYXRvciBidWlsZD0iZmFsc2UiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UZXN0VmFsaWRhdG9yNSIgbWFudWFsPSJmYWxzZSI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBleHQ9InRlc3Q1Ij4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JEZWxlZ2F0ZXMiPgotICAgICAgPGRlbGVnYXRlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVGVzdFZhbGlkYXRvcjVEIgotICAgICAgICAgICAgbmFtZT0iJVRlc3Q1RC5WYWxpZGF0b3IuTmFtZSIKLSAgICAgICAgICAgIHRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVGVzdFZhbGlkYXRvcjUiPgotICAgICAgPC9kZWxlZ2F0ZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlRlc3Q2IgotICAgICAgICAgbmFtZT0iJVRlc3Q2LlZhbGlkYXRvci5OYW1lIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UZXN0VmFsaWRhdG9yNiIKLSAgICAgICAgICAgIG1hbnVhbD0iZmFsc2UiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50bGRzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGV4Y2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8ZmlsZQotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ii5wcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0iZmlsZSI+Ci0gICAgICAgICAgICAgICA8L2ZpbGU+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9leGNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiCi0gICAgICAgICBpZD0iVGVzdDciIG5hbWU9IiVUZXN0Ny5WYWxpZGF0b3IuTmFtZSI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0iZmFsc2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVGVzdFZhbGlkYXRvcjciCi0gICAgICAgICAgICBtYW51YWw9ImZhbHNlIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0idGVzdDEiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiCi0gICAgICAgICBpZD0iVGVzdDgiIG5hbWU9IlRlc3Q4Ij4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UZXN0VmFsaWRhdG9yOCIKLSAgICAgICAgICAgIG1hbnVhbD0iZmFsc2UiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8ZmlsZSBuYW1lPSJmaWxlLnNwZWNpZmljIiB0eXBlPSJmaWxlIi8+Ci0gICAgICAgICAgICAgICA8ZmlsZSBuYW1lPSJzb3VyY2UvZnVsbC5zcGVjaWZpYyIgdHlwZT0iZnVsbCIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiCi0gICAgICAgICBpZD0iVDFBIiBuYW1lPSJUMUEgVmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UMUFWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9ImZhbHNlIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0idGVzdDEiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgIDxncm91cAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi50MWdyb3VwIj4KLSAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgICAgPC9leHRlbnNpb24+Ci0gICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIiBpZD0iVDFCIiBuYW1lPSJUMUIgVmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3IgYnVpbGQ9ImZhbHNlIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDFCIgotICAgICAgICAgICAgbWFya2VySWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi50MWJtYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgZXh0PSJ0MWIiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgICA8L2V4dGVuc2lvbj4KLSAgICAgCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiIGlkPSJUMUMiIG5hbWU9IlQxQyI+Ci0gICAgICA8dmFsaWRhdG9yIGJ1aWxkPSJmYWxzZSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQxQyIgbWFudWFsPSJmYWxzZSI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBleHQ9InQxYyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGV4Y2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8ZmlsZQotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBuYW1lPSJpZ25vcmUiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJmb2xkZXIiPgotICAgICAgICAgICAgICAgPC9maWxlPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvZXhjbHVkZT4KLSAgICAgICAgIDxncm91cAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi50MWdyb3VwIj4KLSAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAKLSA8ZXh0ZW5zaW9uIGlkPSJ0MmEiIG5hbWU9IlQyQSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgPHZhbGlkYXRvcj4KLSAgICAgICA8aGVscGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQyQUhlbHBlciI+Ci0gICAgICAgPC9oZWxwZXI+Ci0gICAgICAgPHJ1bgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UMkEiCi0gICAgICAgICAgICAgZW5hYmxlZD0iZmFsc2UiPgotICAgICAgIDwvcnVuPgotICAgIDwvdmFsaWRhdG9yPgotIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBpZD0idDJiIgotICAgICAgIG5hbWU9IlQyQiIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICA8dmFsaWRhdG9yPgotICAgICAgIDxoZWxwZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDJBSGVscGVyIj4KLSAgICAgICA8L2hlbHBlcj4KLSAgICAgICA8cnVuCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQyQiIKLSAgICAgICAgICAgICBlbmFibGVkPSJ0cnVlIj4KLSAgICAgICA8L3J1bj4KLSAgICA8L3ZhbGlkYXRvcj4KLSA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9InQxYm1hcmtlciIKLSAgICAgICBuYW1lPSJUMUIgTWVzc2FnZSIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICAgPHN1cGVyCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIj4KLSAgICAgIDwvc3VwZXI+Ci0gICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9wZXJzaXN0ZW50PgotIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yR3JvdXAiPgotICAgIDxncm91cAotICAgICAgICAgIGlkPSJ0MWdyb3VwIj4KLSAgICAgICA8bGlzdGVuZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDFHcm91cCI+Ci0gICAgICAgPC9saXN0ZW5lcj4KLSAgICA8L2dyb3VwPgotIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24gaWQ9ImV4Y2x1ZGUxIiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uZXhjbHVkZSI+Ci0gICAgPHZhbGlkYXRvcgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uVDFBIj4KLSAgICAgICA8ZXhjbHVkZT4KLSAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgPHByb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuTW9kdWxlQ29yZU5hdHVyZSI+Ci0gICAgICAgICAgICAgPC9wcm9qZWN0TmF0dXJlPgotICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgPC9leGNsdWRlPgotICAgIDwvdmFsaWRhdG9yPgotIDwvZXh0ZW5zaW9uPgotIAotICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiIgaWQ9IlQ0QSIgbmFtZT0iVDRBIj4KLSAgICAgIAk8dmFsaWRhdG9yIGJ1aWxkPSJmYWxzZSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQ0QSIgbWFudWFsPSJmYWxzZSI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGV4dD0idGVzdDEiPjwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmYWNldCBpZD0ianN0LmphdmEiIHZlcnNpb249IjUuMCIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gCi0gICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIiBpZD0iVDRCIiBuYW1lPSJUNEIiPgotICAgICAgCTx2YWxpZGF0b3IgYnVpbGQ9ImZhbHNlIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDRCIiBtYW51YWw9ImZhbHNlIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQgZXh0PSJ0ZXN0MSI+PC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZhY2V0IGlkPSJqc3QuamF2YSIgdmVyc2lvbj0iNi4wIi8+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLSAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiIGlkPSJUNUEiIG5hbWU9IlQ1QSI+Ci0gICAgICAJPHZhbGlkYXRvciBidWlsZD0iZmFsc2UiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UNUEiIG1hbnVhbD0iZmFsc2UiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8cGF0dGVybiByZWdleD0iLiovc2Vjb25kL3RoaXJkLy4qIj48L3BhdHRlcm4+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAKLSAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiIGlkPSJUNUIiIG5hbWU9IlQ1QiI+Ci0gICAgICAJPHZhbGlkYXRvciBidWlsZD0iZmFsc2UiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UNUIiIG1hbnVhbD0iZmFsc2UiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8cGF0dGVybiByZWdleD0iLiovc2Vjb25keC90aGlyZC8uKiI+PC9wYXR0ZXJuPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIiBpZD0iVDVDIiBuYW1lPSJUNUMiPgotICAgICAgCTx2YWxpZGF0b3IgYnVpbGQ9ImZhbHNlIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDVDIiBtYW51YWw9ImZhbHNlIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQgZXh0PSJ0ZXN0MSI+PC9maWxlZXh0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uIGlkPSJleGNsdWRlMiIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmV4Y2x1ZGUiPgotICAgIDx2YWxpZGF0b3IgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5UNUMiPgotICAgICAgIDxleGNsdWRlPgotICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgICA8cGF0dGVybiByZWdleD0iLiovc2Vjb25kL3RoaXJkLy4qIj48L3BhdHRlcm4+Ci0gICAgICAgICAgPC9ydWxlcz4KLSAgICAgICA8L2V4Y2x1ZGU+Ci0gICAgPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiIgaWQ9IlQ2QSIgbmFtZT0iVDZBIj4KLSAgICAgIAk8dmFsaWRhdG9yIGJ1aWxkPSJmYWxzZSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQ2QSI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGV4dD0idDZhIj48L2ZpbGVleHQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIiBpZD0iVDdBIiBuYW1lPSJUN0EiPgotICAgICAgCTx2YWxpZGF0b3IgYnVpbGQ9ImZhbHNlIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDdBIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGZpbGVleHQgZXh0PSJ0N2EiPjwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL3ZhbGlkYXRpb24vQWN0aXZhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwZTBjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBfY29udGV4dDsKLQkKLQlwdWJsaWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gX2NvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlfY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFdyaXRlIHRoaXMgZXhjZXB0aW9uIHRvIHRoZSBsb2cuCi0JICogPHA+Ci0JICogV2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIG9mIG1vdmluZyB0byBhIG5ldyBhcHByb2FjaCBmb3IgbG9jYWxpemVkIG1lc3NhZ2VzLiBUaGlzIGlzIHRoZSBuZXcgCi0JICogYXBwcm9hY2ggZm9yIGV4Y2VwdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGUgdGhlIHRocm93YWJsZSwgdGhpcyBjYW4gYmUgbnVsbCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgbm9wLgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSl7Ci0JCWlmIChlID09IG51bGwpcmV0dXJuOwotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsKLQkJZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL0ZpbGVOYW1lcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9GaWxlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwNjEwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL0ZpbGVOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy50ZXN0Y2FzZTsKLQotLyoqCi0gKiBTdG9yZSBmaWxlIG5hbWVzIGluIGEgc2luZ2xlIHBsYWNlIHNvIHRoYXQgdGhleSBhcmUgZWFzeSB0byBmaW5kLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWxlTmFtZXMgewotCVN0cmluZyBkaXNhYmxlZCA9ICJkaXNhYmxlZCI7Ci0JCi0JU3RyaW5nIGZpcnN0VGVzdDJ4ID0gImZpcnN0LnRlc3QyeCI7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdEVudmlyb25tZW50LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWVhY2VkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdEVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy50ZXN0Y2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVXb3Jrc3BhY2VTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RW52aXJvbm1lbnQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBJV29ya3NwYWNlCV93b3Jrc3BhY2U7Ci0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgSVByb2plY3Q+IF9wcm9qZWN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVByb2plY3Q+KDIwKTsKLQkKLQlwdWJsaWMgVGVzdEVudmlyb25tZW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlfd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlpZiAoREVCVUcpewotCQkJX3dvcmtzcGFjZS5nZXRSb290KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBhZGRGb2xkZXIoSVBhdGggcm9vdCwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IHJvb3QuYXBwZW5kKGZvbGRlck5hbWUpOwotCQljcmVhdGVGb2xkZXIocGF0aCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRhbEJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCWdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gYW4gaW5jcmVtZW50YWwgYnVpbGQgYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluY3JlbWVudGFsQnVpbGRBbmRXYWl0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbW9uaXRvcik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuam9pbihtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RhcnQgYSBmdWxsIGJ1aWxkLgotCSAqLwotCXB1YmxpYyB2b2lkIGZ1bGxCdWlsZDIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKLQkJZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogRG8gYSBmdWxsIGJ1aWxkLCBhbmQgd2FpdCB1bnRpbCBhbGwgdGhlIHZhbGlkYXRpb24gaGFzIGZpbmlzaGVkLgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHZvaWQgZnVsbEJ1aWxkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZnVsbEJ1aWxkMihtb25pdG9yKTsKLQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5qb2luKG1vbml0b3IpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7ICAvLyB3ZSBuZWVkIHRvIHNsZWVwIGhlcmUgdG8gZ2l2ZSB0aGUgImZpbmlzaGVkIiBqb2IgYSBjaGFuY2UgdG8gcnVuLgkJCi0JfQotCQotCS8qKgotCSAqIERvIGEgY2xlYW4gYnVpbGQsIGFuZCB3YWl0IHVudGlsIGFsbCB0aGUgdmFsaWRhdGlvbiBoYXMgZmluaXNoZWQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbkJ1aWxkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbW9uaXRvcik7Ci0JCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuam9pbihtb25pdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRm9sZGVyIGNyZWF0ZUZvbGRlcihJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpIDw9IDEpcmV0dXJuIG51bGw7Ci0JCQotCQlJRm9sZGVyIGZvbGRlciA9IF93b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihwYXRoKTsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpewotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gZm9sZGVyOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBfd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpOwotCQlJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXByb2plY3QuY3JlYXRlKG1vbml0b3IpOwotCQkJCXByb2plY3Qub3Blbihtb25pdG9yKTsJCi0JCQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChwcm9qZWN0KTsKLQkJCX0JCQotCQl9OwotCQkKLQkJX3dvcmtzcGFjZS5ydW4oY3JlYXRlLCBudWxsKTsKLQkJX3Byb2plY3RzLnB1dChuYW1lLCBwcm9qZWN0KTsKLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoREVCVUcpcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0PiBpdD1fcHJvamVjdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gaXQubmV4dCgpOwotCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUZpbGUgYWRkRmlsZShJUGF0aCBmb2xkZXIsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCUlQYXRoIGZpbGVQYXRoID0gZm9sZGVyLmFwcGVuZChmaWxlTmFtZSk7Ci0JCXJldHVybiBjcmVhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50cy5nZXRCeXRlcygiVVRGOCIpKTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGNyZWF0ZUZpbGUoSVBhdGggZmlsZVBhdGgsIGJ5dGVbXSBjb250ZW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gX3dvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQllbHNlIGZpbGUuY3JlYXRlKGluLCB0cnVlLCBudWxsKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpewotCQlyZXR1cm4gX3dvcmtzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZmluZFByb2plY3QoU3RyaW5nIG5hbWUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IF93b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JCWlmIChwcm9qZWN0LmV4aXN0cygpKXJldHVybiBwcm9qZWN0OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogU2luY2Ugb3RoZXIgcGx1Zy1pbnMgY2FuIGFkZCBhbmQgcmVtb3ZlIHZhbGlkYXRvcnMsIHR1cm4gb2ZmIGFsbCB0aGUgb25lcyB0aGF0IGFyZSBub3QgcGFydCBvZgotCSAqIHRoZXNlIHRlc3RzLgotCSAqIAotCSAqIEBwYXJhbSB2YWxpZGF0b3JQcmVmaXggVGhlIHN0YXJ0IG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MgbmFtZSwgYnV0IHdpdGhvdXQgdGhlIHBhY2thZ2UgbmFtZS4gRm9yIGV4YW1wbGUgIlQ1Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlT25seVRoZXNlVmFsaWRhdG9ycyhTdHJpbmcgdmFsaWRhdG9yUHJlZml4KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRpb25GcmFtZXdvcmsgdmYgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKTsKLQkJU3RyaW5nIG5hbWUgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuIiArIHZhbGlkYXRvclByZWZpeDsKLQkJTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIHdzID0gdmYuZ2V0V29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJZm9yIChJTXV0YWJsZVZhbGlkYXRvciB2IDogd3MuZ2V0VmFsaWRhdG9ycygpKXsKLQkJCWJvb2xlYW4gZW5hYmxlID0gdi5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKS5zdGFydHNXaXRoKG5hbWUpOwotCQkJdi5zZXRCdWlsZFZhbGlkYXRpb24oZW5hYmxlKTsKLQkJCXYuc2V0TWFudWFsVmFsaWRhdGlvbihlbmFibGUpOwotCQl9Ci0JCXZmLmFwcGx5Q2hhbmdlcyh3cywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugb3RoZXIgcGx1Zy1pbnMgY2FuIGFkZCBhbmQgcmVtb3ZlIHZhbGlkYXRvcnMsIHR1cm4gb2ZmIGFsbCB0aGUgdmFsaWRhdG9ycyBleGNlcHQgdGhpcyBvbmUuCi0JICogCi0JICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHZhbGlkYXRvciB0byB0dXJuIG9uLiBGb3IgZXhhbXBsZQotCSAqIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3RWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlT25seVRoaXNWYWxpZGF0b3IoU3RyaW5nIG5hbWUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3Mgd3MgPSB2Zi5nZXRXb3Jrc3BhY2VTZXR0aW5ncygpOwotCQlmb3IgKElNdXRhYmxlVmFsaWRhdG9yIHYgOiB3cy5nZXRWYWxpZGF0b3JzKCkpewotCQkJYm9vbGVhbiBlbmFibGUgPSB2LmdldFZhbGlkYXRvckNsYXNzbmFtZSgpLmVxdWFscyhuYW1lKTsKLQkJCXYuc2V0QnVpbGRWYWxpZGF0aW9uKGVuYWJsZSk7Ci0JCQl2LnNldE1hbnVhbFZhbGlkYXRpb24oZW5hYmxlKTsKLQkJfQotCQl2Zi5hcHBseUNoYW5nZXMod3MsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0dXJub2ZmQXV0b0J1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSBfd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmICh3ZC5pc0F1dG9CdWlsZGluZygpKXsKLQkJCXdkLnNldEF1dG9CdWlsZGluZyhmYWxzZSk7Ci0JCQlfd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdkKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHVybk9uQXV0b0J1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gd2QgPSBfd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmICghd2QuaXNBdXRvQnVpbGRpbmcoKSl7Ci0JCQl3ZC5zZXRBdXRvQnVpbGRpbmcodHJ1ZSk7Ci0JCQlfd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKHdkKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSBudW1iZXIgb2YgdmFsaWRhdGlvbiBlcnJvcnMgb24gdGhpcyByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBiZWluZyBjaGVja2VkLgotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwcm9ibGVtIG1hcmtlcnMgdGhhdCBoYXZlIHRoZSBlcnJvciBzZXZlcml0eS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVycm9ycyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaW50IGVycm9ycyA9IDA7Ci0JCXRyeSB7Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKFZhbENvbnN0YW50cy5Qcm9ibGVtTWFya2VyLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpewotCQkJCWludCBzZXZlcml0eSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCWlmIChzZXZlcml0eSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKWVycm9ycysrOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJLy9lYXQgaXQKLQkJfQotCQlyZXR1cm4gZXJyb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlMS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZDZjN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGUxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy50ZXN0Y2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JRGVwZW5kZW5jeUluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkRlc2VyaWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UZXN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3RWYWxpZGF0b3IyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3RWYWxpZGF0b3I0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3RWYWxpZGF0b3I1RDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UZXN0VmFsaWRhdG9yNjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UZXN0VmFsaWRhdG9yNzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5WYWxDb3VudGVyczsKLQotcHVibGljIGNsYXNzIFRlc3RTdWl0ZTEgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKLQlwcml2YXRlIElQcm9qZWN0CQlfdGVzdFByb2plY3Q7Ci0JCi0JcHJpdmF0ZSBJRmlsZQkJCV9tYXBUZXN0MTsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RTdWl0ZTEuY2xhc3MpOwotCX0gCi0JCi0JcHVibGljIFRlc3RTdWl0ZTEoU3RyaW5nIG5hbWUpewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlfZW52ID0gbmV3IFRlc3RFbnZpcm9ubWVudCgpOwotCQlfdGVzdFByb2plY3QgPSBfZW52LmZpbmRQcm9qZWN0KCJUZXN0UHJvamVjdCIpOwotCQlpZiAoX3Rlc3RQcm9qZWN0ICE9IG51bGwpcmV0dXJuOwotCQlfZW52LnR1cm5vZmZBdXRvQnVpbGQoKTsKLQkJZW5hYmxlT25seVRlc3RWYWxpZGF0b3JzKCk7Ci0JCV90ZXN0UHJvamVjdCA9IF9lbnYuY3JlYXRlUHJvamVjdCgiVGVzdFByb2plY3QiKTsKLQkJSVBhdGggZm9sZGVyID0gX2Vudi5hZGRGb2xkZXIoX3Rlc3RQcm9qZWN0LmdldEZ1bGxQYXRoKCksICJzb3VyY2UiKTsKLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgImZpcnN0LnRlc3QxIiwgImluY2x1ZGUgbWFwLnRlc3QxXG4iICsKLQkJCSJpbmZvIC0gaW5mb3JtYXRpb25cbiIgKwotCQkJIndhcm5pbmcgLSB3YXJuaW5nXG4iICsKLQkJCSJlcnJvciAtIGVycm9yXG5cbiIgKwotCQkJInQxZXJyb3IgLSBleHRyYSBlcnJvclxuIiArCi0JCQkidDF3YXJuaW5nIC0gZXh0cmEgd2FybmluZyIpOwotCQlfZW52LmFkZEZpbGUoZm9sZGVyLCAic2Vjb25kLnRlc3QxIiwgImluZm8gLSBpbmZvcm1hdGlvblxuIiArCi0JCQkid2FybmluZyAtIHdhcm5pbmdcbiIgKwotCQkJImVycm9yIC0gZXJyb3JcblxuIiArCi0JCQkidDFlcnJvciAtIGV4dHJhIGVycm9yXG4iICsKLQkJCSJ0MXdhcm5pbmcgLSBleHRyYSB3YXJuaW5nIik7Ci0JCV9tYXBUZXN0MSA9IF9lbnYuYWRkRmlsZShmb2xkZXIsICJtYXAudGVzdDEiLCAKLQkJCSIjIHdpbGwgaG9sZCBmdXR1cmUgbWFwcGluZ3NcblxuIiArCi0JCQkiIyBzeW50YXg6IG1hcCB0YXJnZXQgcmVwbGFjZW1lbnRcbiIgKwotCQkJIiMgZm9yIGV4YW1wbGUgbWFwIHQxZXJyb3IgZXJyb3IgLSB3b3VsZCByZXBsYWNlIGFsbCB0MWVycm9yIHRva2VucyB3aXRoIGVycm9yIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmaXJzdC50ZXN0MiIsICIjIHNhbXBsZSBmaWxlIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJ0aGlyZC50ZXN0NCIsIAotCQkJIiMgRG9lc24ndCByZWFsbHkgbWF0dGVyXG4iICsKLQkJCSIjIFdlIGp1c3Qgd2FudCB0byBtYWtlIHRoZSBidWlsZCBhIGJpdCBzbG93ZXIuIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmb3VydGgudGVzdDQiLCAiIyBEb2Vzbid0IHJlYWxseSBtYXR0ZXIiKTsKLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgImZpZnRoLnRlc3Q1IiwgIiMgRG9lc24ndCByZWFsbHkgbWF0dGVyIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmb3JGdW4ueG1sIiwgIjxmdW4+dGltZXM8L2Z1bj4iKTsKLQkJCi0JCV9lbnYuYWRkRmlsZShfdGVzdFByb2plY3QuZ2V0RnVsbFBhdGgoKSwgImZpbGUuc3BlY2lmaWMiLCAiIyBUaGlzIHNob3VsZCBiZSB2YWxpZGF0ZWQgYnkgVGVzdDIiKTsKLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgImZpbGUuc3BlY2lmaWMiLCAiIyBUaGlzIHNob3VsZCBiZSB2YWxpZGF0ZWQgYnkgVGVzdDIiKTsKLQkJCi0JCV9lbnYuYWRkRmlsZShfdGVzdFByb2plY3QuZ2V0RnVsbFBhdGgoKSwgImZ1bGwuc3BlY2lmaWMiLCAiIyBUaGlzIHNob3VsZCBub3QgYmUgdmFsaWRhdGVkIGJ5IFRlc3QyIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmdWxsLnNwZWNpZmljIiwgIiMgVGhpcyBzaG91bGQgYmUgdmFsaWRhdGVkIGJ5IFRlc3QyIik7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugb3RoZXIgcGx1Zy1pbnMgY2FuIGFkZCBhbmQgcmVtb3ZlIHZhbGlkYXRvcnMsIHR1cm4gb2ZmIGFsbCB0aGUgb25lcyB0aGF0IGFyZSBub3QgcGFydCBvZgotCSAqIHRoZXNlIHRlc3RzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZW5hYmxlT25seVRlc3RWYWxpZGF0b3JzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlWYWxpZGF0aW9uRnJhbWV3b3JrIHZmID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JCU11dGFibGVXb3Jrc3BhY2VTZXR0aW5ncyB3cyA9IHZmLmdldFdvcmtzcGFjZVNldHRpbmdzKCk7Ci0JCWZvciAoSU11dGFibGVWYWxpZGF0b3IgdiA6IHdzLmdldFZhbGlkYXRvcnMoKSl7Ci0JCQlib29sZWFuIGVuYWJsZSA9IHYuZ2V0VmFsaWRhdG9yQ2xhc3NuYW1lKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVGVzdCIpOwotCQkJdi5zZXRCdWlsZFZhbGlkYXRpb24oZW5hYmxlKTsKLQkJCXYuc2V0TWFudWFsVmFsaWRhdGlvbihlbmFibGUpOwotCQl9Ci0JCXZmLmFwcGx5Q2hhbmdlcyh3cywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJX2Vudi5kaXNwb3NlKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleCgpewotCQlWYWxpZGF0aW9uRnJhbWV3b3JrIHZmID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JCUlEZXBlbmRlbmN5SW5kZXggaW5kZXggPSB2Zi5nZXREZXBlbmRlbmN5SW5kZXgoKTsKLQkJYXNzZXJ0Tm90TnVsbChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleDIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlWYWxpZGF0aW9uRnJhbWV3b3JrIHZmID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JCUlEZXBlbmRlbmN5SW5kZXggaW5kZXggPSB2Zi5nZXREZXBlbmRlbmN5SW5kZXgoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJSVJlc291cmNlIHIgPSByb290LmZpbmRNZW1iZXIoIlRlc3RQcm9qZWN0L3NvdXJjZS9tYXAudGVzdDEiKTsKLQkJSVByb2plY3QgcCA9IHIuZ2V0UHJvamVjdCgpOwotCQlwLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCVZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLmpvaW4obnVsbCk7Ci0KLQkJciA9IHJvb3QuZmluZE1lbWJlcigiVGVzdFByb2plY3Qvc291cmNlL2ZpcnN0LnRlc3QxIik7Ci0JCWFzc2VydEZhbHNlKGluZGV4LmlzRGVwZW5kZWRPbihyKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbGlkYXRvcnMoKXsKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBfZW52LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKCJUZXN0UHJvamVjdC9zb3VyY2UvZmlyc3QudGVzdDEiKTsKLQkJVmFsaWRhdG9yW10gdmFsaWRhdG9ycyA9IHZmLmdldFZhbGlkYXRvcnNGb3IocmVzb3VyY2UsIGZhbHNlLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUodmFsaWRhdG9ycy5sZW5ndGggPiAwKTsKLQkJCi0JCVN0cmluZyBpZCA9IFRlc3RWYWxpZGF0b3IuaWQoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9MDsgaTx2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKXsKLQkJCWlmICh2YWxpZGF0b3JzW2ldLmdldElkKCkuZXF1YWxzKGlkKSljb3VudCsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBjb3VudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0MSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCVRyYWNpbmcubG9nKCJUZXN0U3VpdGUtMDI6IHRlc3RUZXN0MSBzdGFydGluZyIpOwotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlWYWxpZGF0aW9uRnJhbWV3b3JrIHZmID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB7X3Rlc3RQcm9qZWN0fTsKLQkJLyoKLQkJICogQWZ0ZXIgdGhlIHZhbGlkYXRpb24gd2UgZXhwZWN0IGZpcnN0LnRlc3QxIHRvIGhhdmUgMSBlcnJvciwgMSB3YXJuaW5nIGFuZCAxIGluZm8uIEFuZCBmb3IKLQkJICogc2Vjb25kLnRlc3QxIHRvIGhhdmUgMSBlcnJvciwgMSB3YXJuaW5nIGFuZCAxIGluZm8uIAotCQkgKi8KLQkJVmFsaWRhdGlvblJlc3VsdHMgdnIgPSB2Zi52YWxpZGF0ZShwcm9qZWN0cywgdHJ1ZSwgZmFsc2UsIG1vbml0b3IpOwotCQkKLQkJSVJlc291cmNlIHJlc291cmNlID0gX2Vudi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcigiVGVzdFByb2plY3Qvc291cmNlL2ZpcnN0LnRlc3QxIik7Ci0JCWNoZWNrRmlyc3RQYXNzKHJlc291cmNlLCB2cik7Ci0JCQotCQkvLyBhZGQgYSBmaXJzdCBidWlsZCBzbyB0aGF0IHdlIGtub3cgdGhhdCBvbmx5IHRoZSBtYXAgZmlsZSBoYXMgY2hhbmdlZAotCQlfZW52LmluY3JlbWVudGFsQnVpbGQoKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQl2Zi5qb2luKG1vbml0b3IpOwotCQkKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIm1hcCB0MWVycm9yIGVycm9yXG5tYXAgdDF3YXJuaW5nIHdhcm5pbmciLmdldEJ5dGVzKCkpOwotCQlfbWFwVGVzdDEuc2V0Q29udGVudHMoaW4sIHRydWUsIHRydWUsIG1vbml0b3IpOwotCQkKLQkJVGhyZWFkLnNsZWVwKDIwMDApOyAgLy8gd2UgbmVlZCB0byBzbGVlcCBoZXJlIHRvIGdpdmUgdGhlICJmaW5pc2hlZCIgam9iIGEgY2hhbmNlIHRvIHJ1bi4KLQkJVGVzdFZhbGlkYXRvcjQuZ2V0Q291bnRlcnMoKS5yZXNldCgpOwotCQlUZXN0VmFsaWRhdG9yNUQuZ2V0Q291bnRlcnMoKS5yZXNldCgpOwotCQlfZW52LmluY3JlbWVudGFsQnVpbGQoKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQl2Zi5qb2luKG1vbml0b3IpOwotCQkKLQkJVmFsQ291bnRlcnMgdmMgPSBUZXN0VmFsaWRhdG9yNC5nZXRDb3VudGVycygpOwotCQlUcmFjaW5nLmxvZygiVGVzdFN1aXRlLTAzOiB0ZXN0VGVzdDE6ICIgKyB2Yy50b1N0cmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHZjLnN0YXJ0aW5nQ291bnQsIHZjLmZpbmlzaGVkQ291bnQpOwotCQlhc3NlcnRFcXVhbHModmMuc3RhcnRpbmdQcm9qZWN0Q291bnQsIHZjLmZpbmlzaGVkUHJvamVjdENvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKHZjLnN0YXJ0aW5nQ291bnQsIDEpOwotCQlhc3NlcnRFcXVhbHModmMuZmluaXNoZWRDb3VudCwgMSk7Ci0JCQotCQl2YyA9IFRlc3RWYWxpZGF0b3I1RC5nZXRDb3VudGVycygpOwotCQlhc3NlcnRFcXVhbHModmMuc3RhcnRpbmdDb3VudCwgdmMuZmluaXNoZWRDb3VudCk7Ci0JCWFzc2VydEVxdWFscyh2Yy5zdGFydGluZ1Byb2plY3RDb3VudCwgdmMuZmluaXNoZWRQcm9qZWN0Q291bnQpOwotCQlhc3NlcnRFcXVhbHModmMuc3RhcnRpbmdDb3VudCwgMSk7Ci0JCWFzc2VydEVxdWFscyh2Yy5maW5pc2hlZENvdW50LCAxKTsKLQkJCQkKLQkJYXNzZXJ0VHJ1ZSgiV2UgZXhwZWN0IHRoZSBkZWxlZ2F0aW5nIHZhbGlkYXRvciBUZXN0NUQgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UiLCAKLQkJCVRlc3RWYWxpZGF0b3I1RC5nZXRDYWxsZWRDb3VudCgpPjApOwotCQkKLQkJY2hlY2tTZWNvbmRQYXNzKHJlc291cmNlKTsJCi0JCVRyYWNpbmcubG9nKCJUZXN0U3VpdGUtMDQ6dGVzdFRlc3QxIGZpbmlzaGVkIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0MigpIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlJUmVzb3VyY2UgdGVzdDIgPSBfdGVzdFByb2plY3QuZmluZE1lbWJlcigic291cmNlL2ZpcnN0LnRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDIpOwotCQlWYWxpZGF0b3JbXSB2YWxzID0gdmYuZ2V0VmFsaWRhdG9yc0Zvcih0ZXN0MiwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvciAoVmFsaWRhdG9yIHYgOiB2YWxzKXsKLQkJCVN0cmluZyBpZCA9IHYuZ2V0SWQoKTsKLQkJCWlmIChpZC5lcXVhbHMoVGVzdFZhbGlkYXRvci5pZCgpKSlmYWlsKCJmaXJzdC50ZXN0MiBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCBieSB0aGUgdGVzdDEgdmFsaWRhdG9yIik7Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZSB0ZXN0MSA9IF90ZXN0UHJvamVjdC5maW5kTWVtYmVyKCJzb3VyY2UvZmlyc3QudGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MSk7Ci0JCXZhbHMgPSB2Zi5nZXRWYWxpZGF0b3JzRm9yKHRlc3QxLCB0cnVlLCB0cnVlKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKFZhbGlkYXRvciB2IDogdmFscyl7Ci0JCQlTdHJpbmcgaWQgPSB2LmdldElkKCk7Ci0JCQlpZiAoaWQuZXF1YWxzKFRlc3RWYWxpZGF0b3IuaWQoKSkpZm91bmQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZm91bmQpOwotCX0KLQkKLQkvKioKLQkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIHRlc3QgdmFsaWRhdG9ycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnRWYWxpZGF0b3JzKCl7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoVmFsaWRhdG9yIHYgOiBWYWxNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRWYWxpZGF0b3JzKCkpewotCQkJaW50IGkgPSB2LmdldElkKCkuaW5kZXhPZigiLlRlc3QiKTsKLQkJCWlmIChpICE9IC0xKWNvdW50Kys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBudW1iZXIgb2YgVGVzdCB2YWxpZGF0b3JzIiwgOCwgY291bnQpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGlmIHdlIGNhbiBnZXQgYSBtZXNzYWdlIHRoYXQgd2FzIGRlZmluZWQgdGhyb3VnaCB0aGUgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlcygpIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlWYWxpZGF0b3IgdiA9IHZmLmdldFZhbGlkYXRvcihUZXN0VmFsaWRhdG9yMi5pZCgpLCBudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCgiV2UgZXhwZWN0ZWQgdG8gZmluZCBUZXN0VmFsaWRhdG9yMiIsIHYpOwotCQlNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIG1zID0gdi5nZXRNZXNzYWdlKCJiYWQiKTsKLQkJYXNzZXJ0Tm90TnVsbCgiV2UgZXhwZWN0ZWQgdG8gZmluZCBhIG1lc3NhZ2UgZm9yICdiYWQnIiwgbXMpOwotCQlhc3NlcnRFcXVhbHMoTWVzc2FnZVNldmVyaXR5U2V0dGluZy5TZXZlcml0eS5FcnJvciwgbXMuZ2V0Q3VycmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHYuZ2V0TWVzc2FnZVNldHRpbmdzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpewotCQlTZXJpYWxpemVyIHMgPSBuZXcgU2VyaWFsaXplcigyMCk7Ci0JCXMucHV0KHRydWUpOwotCQlzLnB1dChmYWxzZSk7Ci0JCXMucHV0KCJIaSB0aGVyZSIpOwotCQlzLnB1dCgyNSk7Ci0JCVN0cmluZyB0ZXN0ID0gcy50b1N0cmluZygpOwotCQkKLQkJRGVzZXJpYWxpemVyIGQgPSBuZXcgRGVzZXJpYWxpemVyKHRlc3QpOwotCQlhc3NlcnRUcnVlKGQuZ2V0Qm9vbGVhbigpKTsKLQkJYXNzZXJ0RmFsc2UoZC5nZXRCb29sZWFuKCkpOwotCQlhc3NlcnRFcXVhbHMoIkhpIHRoZXJlIiwgZC5nZXRTdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoZC5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGQuZ2V0SW50KCkpOwotCQlhc3NlcnRGYWxzZShkLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXNwZW5kKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlWYWxpZGF0b3IgdiA9IHZmLmdldFZhbGlkYXRvcihUZXN0VmFsaWRhdG9yNi5pZCgpLCBudWxsKTsKLQkJVGVzdFZhbGlkYXRvcjYgdDYgPSAoVGVzdFZhbGlkYXRvcjYpdi5hc1YyVmFsaWRhdG9yKCkuZ2V0VmFsaWRhdG9yKCk7Ci0JCQotCQl2ID0gdmYuZ2V0VmFsaWRhdG9yKFRlc3RWYWxpZGF0b3I3LmlkKCksIG51bGwpOwotCQlUZXN0VmFsaWRhdG9yNyB0NyA9IChUZXN0VmFsaWRhdG9yNyl2LmFzVjJWYWxpZGF0b3IoKS5nZXRWYWxpZGF0b3IoKTsKLQkJdDcucmVzZXQoKTsKLQkJCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJX2Vudi5mdWxsQnVpbGQyKG51bGwpOwotCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCXZmLmpvaW4obnVsbCk7Ci0JCWxvbmcgZmlyc3QgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJbG9uZyB2YWxCdWlsZCA9IGZpcnN0LXN0YXJ0OwotCQlhc3NlcnRUcnVlKCJXZSBleHBlY3QgdGhlIGJ1aWxkIHRvIHRha2UgbG9uZ2VyIHRoYW4gM3MsIGJ1dCBpdCBjb21wbGV0ZWQgaW4gIiArIHZhbEJ1aWxkICsgIm1zIiwgdmFsQnVpbGQgPiAzMDAwKTsKLQkJCi0JCUlSZXNvdXJjZSBwcm9qZWN0RmlsZSA9IF90ZXN0UHJvamVjdC5maW5kTWVtYmVyKCIucHJvamVjdCIpOwotCQlhc3NlcnRGYWxzZSgiV2Ugc2hvdWxkIG5vdCBiZSB2YWxpZGF0aW5nIHRoZSAucHJvZHVjdCBmaWxlIiwgdDYuZ2V0U2V0KCkuY29udGFpbnMocHJvamVjdEZpbGUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiV2UgZXhwZWN0ZWQgdGhlIHZhbGlkYXRpb24gdG8gYmUgc3VzcGVuZGVkIGFmdGVyIHRoZSBmaXJzdCBjYWxsIiwgMSwgdDcuZ2V0U2V0KCkuc2l6ZSgpKTsKLQkJCi0JCXZmLnN1c3BlbmRBbGxWYWxpZGF0aW9uKHRydWUpOwotCQlfZW52LmZ1bGxCdWlsZDIobnVsbCk7Ci0JCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJdmYuam9pbihudWxsKTsKLQkJbG9uZyBzZWNvbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJdmYuc3VzcGVuZEFsbFZhbGlkYXRpb24oZmFsc2UpOwotCQlsb25nIG5vdmFsQnVpbGQgPSBzZWNvbmQgLSBmaXJzdDsKLQkJYXNzZXJ0VHJ1ZSgiV2UgZXhjZXB0IHRoZSBidWlsZCB0byBnbyBmYXN0ZXIgd2l0aCB2YWxpZGF0aW9uIHR1cm5lZCBvZmYsIGJ1dCBpdCB3YXMgIiArIChub3ZhbEJ1aWxkLXZhbEJ1aWxkKSArCi0JCQkJIiBtcyBmYXN0ZXIiICwgbm92YWxCdWlsZCA8IHZhbEJ1aWxkKTsKLQkJYXNzZXJ0RXF1YWxzKCJXZSBleHBlY3RlZCB0aGUgdmFsaWRhdGlvbiB0byBiZSBzdXNwZW5kZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwiLCAxLCB0Ny5nZXRTZXQoKS5zaXplKCkpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja0ZpcnN0UGFzcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFZhbGlkYXRpb25SZXN1bHRzIHZyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIiwgNSwgdnIuZ2V0U2V2ZXJpdHlFcnJvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBudW1iZXIgb2Ygd2FybmluZyBtZXNzYWdlcyIsIDIsIHZyLmdldFNldmVyaXR5V2FybmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBudW1iZXIgb2YgaW5mbyBtZXNzYWdlcyIsIDIsIHZyLmdldFNldmVyaXR5SW5mbygpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRXhwZWN0ZWQgbnVtYmVyIG9mIG1lc3NhZ2VzIiwgOSwgdnIuZ2V0TWVzc2FnZXMoKS5sZW5ndGgpOwotCQkKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhWYWxDb25zdGFudHMuUHJvYmxlbU1hcmtlciwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJaW50IGVycm9ycyA9MCwgd2FybmluZ3M9MCwgaW5mbz0wOwotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2Vycyl7Ci0JCQlpbnQgc2V2ZXJpdHkgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpewotCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUjogZXJyb3JzKys7Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc6IHdhcm5pbmdzKys7Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk86IGluZm8rKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJXZSBleHBlY3QgdGhlcmUgdG8gYmUgZXhhY3RseSBvbmUgZXJyb3IgbWVzc2FnZSwgYnV0IGVycm9ycz0iICsgZXJyb3JzLCBlcnJvcnMgPT0gMSk7Ci0JCWFzc2VydFRydWUoIldlIGV4cGVjdCB0aGVyZSB0byBiZSBleGFjdGx5IG9uZSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCB3YXJuaW5ncz0iK3dhcm5pbmdzLCB3YXJuaW5ncyA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiV2UgZXhwZWN0IHRoZXJlIHRvIGJlIGV4YWN0bHkgb25lIGluZm8gbWVzc2FnZSwgYnV0IGluZm89IitpbmZvLCBpbmZvID09IDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1NlY29uZFBhc3MoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoVmFsQ29uc3RhbnRzLlByb2JsZW1NYXJrZXIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCWludCBlcnJvcnMgPTAsIHdhcm5pbmdzPTAsIGluZm89MDsKLQkJZm9yIChpbnQgaT0wOyBpPG1hcmtlcnMubGVuZ3RoOyBpKyspewotCQkJaW50IHNldmVyaXR5ID0gbWFya2Vyc1tpXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJc3dpdGNoIChzZXZlcml0eSl7Ci0JCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOiBlcnJvcnMrKzsKLQkJCQlicmVhazsKLQkJCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzogd2FybmluZ3MrKzsKLQkJCQlicmVhazsKLQkJCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTzogaW5mbysrOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChUcmFjaW5nLmlzTG9nZ2luZygpKXsKLQkJCVRyYWNpbmcubG9nKCJUZXN0U3VpdGUtMDE6IGNoZWNrU2Vjb25kUGFzczogIiArIE1pc2MubGlzdE1hcmtlcnMocmVzb3VyY2UpKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJXZSBleHBlY3QgdGhlcmUgdG8gYmUgZXhhY3RseSB0d28gZXJyb3IgbWVzc2FnZXMsIGJ1dCBlcnJvcnM9IiArIGVycm9ycywgZXJyb3JzID09IDIpOwotCQlhc3NlcnRUcnVlKCJXZSBleHBlY3QgdGhlcmUgdG8gYmUgZXhhY3RseSB0d28gd2FybmluZyBtZXNzYWdlcywgYnV0IHdhcm5pbmdzPSIrd2FybmluZ3MsIHdhcm5pbmdzID09IDIpOwotCQlhc3NlcnRUcnVlKCJXZSBleHBlY3QgdGhlcmUgdG8gYmUgZXhhY3RseSBvbmUgaW5mbyBtZXNzYWdlLCBidXQgaW5mbz0iK2luZm8sIGluZm8gPT0gMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjViMjljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMudGVzdGNhc2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDFCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQxR3JvdXA7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFRlc3RTdWl0ZTIgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKLQlwcml2YXRlIElQcm9qZWN0CV90ZXN0UHJvamVjdDsKLQkKLQlwcml2YXRlIElGaWxlCQlfZmlyc3RUZXN0MTsKLQlwcml2YXRlIElGaWxlCQlfc2Vjb25kVGVzdDE7Ci0JcHJpdmF0ZSBJRmlsZQkJX2ZpcnN0VDFCOwotCQotCXByaXZhdGUgSUZpbGUJCV9maXJzdFRlc3QyeDsKLQkKLQlwcml2YXRlIElGaWxlCQlfZmlyc3RUMUM7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0U3VpdGUyLmNsYXNzKTsKLQl9IAotCQotCXB1YmxpYyBUZXN0U3VpdGUyKFN0cmluZyBuYW1lKXsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJX2VudiA9IG5ldyBUZXN0RW52aXJvbm1lbnQoKTsKLQkJX3Rlc3RQcm9qZWN0ID0gX2Vudi5maW5kUHJvamVjdCgiVGVzdFByb2plY3QiKTsKLQkJaWYgKF90ZXN0UHJvamVjdCAhPSBudWxsKXJldHVybjsKLQkJX2Vudi50dXJub2ZmQXV0b0J1aWxkKCk7Ci0JCWFkanVzdEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCV90ZXN0UHJvamVjdCA9IF9lbnYuY3JlYXRlUHJvamVjdCgiVGVzdFByb2plY3QiKTsKLQkJSVBhdGggZm9sZGVyID0gX2Vudi5hZGRGb2xkZXIoX3Rlc3RQcm9qZWN0LmdldEZ1bGxQYXRoKCksICJzb3VyY2UiKTsKLQkJX2ZpcnN0VGVzdDEgPSBfZW52LmFkZEZpbGUoZm9sZGVyLCAiZmlyc3QudGVzdDEiLCAiaW5jbHVkZSBtYXAudGVzdDFcbmluZm8gLSBpbmZvcm1hdGlvblxud2FybmluZyAtIHdhcm5pbmdcbmVycm9yIC0gZXJyb3JcblxuIiArCi0JCSJ0MWVycm9yIC0gZXh0cmEgZXJyb3JcbnQxd2FybmluZyAtIGV4dHJhIHdhcm5pbmciKTsKLQkJX3NlY29uZFRlc3QxID0gX2Vudi5hZGRGaWxlKGZvbGRlciwgInNlY29uZC50ZXN0MSIsICJpbmZvIC0gaW5mb3JtYXRpb25cbndhcm5pbmcgLSB3YXJuaW5nXG5lcnJvciAtIGVycm9yXG5cbiIgKwotCQkJInQxZXJyb3IgLSBleHRyYSBlcnJvclxudDF3YXJuaW5nIC0gZXh0cmEgd2FybmluZyIpOwotCQlfZmlyc3RUMUIgPSBfZW52LmFkZEZpbGUoZm9sZGVyLCAiZmlyc3QudDFiIiwgImluY2x1ZGUgbWFwLnRlc3QxXG5pbmZvIC0gaW5mb3JtYXRpb25cbndhcm5pbmcgLSB3YXJuaW5nXG5lcnJvciAtIGVycm9yXG5cbiIgKwotCQkidDFlcnJvciAtIGV4dHJhIGVycm9yXG50MXdhcm5pbmcgLSBleHRyYSB3YXJuaW5nIik7Ci0KLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgIm1hcC50ZXN0MSIsICIjIHdpbGwgaG9sZCBmdXR1cmUgbWFwcGluZ3MiKTsKLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgImZpcnN0LnRlc3QyIiwgIiMgc2FtcGxlIGZpbGUiKTsKLQkJX2ZpcnN0VGVzdDJ4ID0gX2Vudi5hZGRGaWxlKGZvbGRlciwgRmlsZU5hbWVzLmZpcnN0VGVzdDJ4LCAiIyBhIGZpbGUgdGhhdCB3aWxsIGJlIHZhbGlkYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHJ1bm5pbmcgdGhlIFQxQSB2YWxpZGF0b3IiKTsKLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgInRoaXJkLnRlc3Q0IiwgIiMgRG9lc24ndCByZWFsbHkgbWF0dGVyXG5XZSBqdXN0IHdhbnQgdG8gbWFrZSB0aGUgYnVpbGQgYSBiaXQgc2xvd2VyLiIpOwotCQlfZW52LmFkZEZpbGUoZm9sZGVyLCAiZm91cnRoLnRlc3Q0IiwgIiMgRG9lc24ndCByZWFsbHkgbWF0dGVyIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmaWZ0aC50ZXN0NSIsICIjIERvZXNuJ3QgcmVhbGx5IG1hdHRlciIpOwotCQkKLQkJSVBhdGggaWdub3JlID0gX2Vudi5hZGRGb2xkZXIoX3Rlc3RQcm9qZWN0LmdldEZ1bGxQYXRoKCksICJpZ25vcmUiKTsKLQkJSVBhdGggbmVzdGVkID0gX2Vudi5hZGRGb2xkZXIoaWdub3JlLCAibmVzdGVkIik7Ci0JCV9maXJzdFQxQyA9IF9lbnYuYWRkRmlsZShuZXN0ZWQsICJmaXJzdC50MWMiLCAiZXJyb3IgLSBlcnJvciIpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBvdGhlciBwbHVnLWlucyBjYW4gYWRkIGFuZCByZW1vdmUgdmFsaWRhdG9ycywgdHVybiBvZmYgYWxsIHRoZSBvbmVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mCi0JICogdGhlc2UgdGVzdHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGp1c3RFbmFibGVkVmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3Mgd3MgPSB2Zi5nZXRXb3Jrc3BhY2VTZXR0aW5ncygpOwotCQlmb3IgKElNdXRhYmxlVmFsaWRhdG9yIHYgOiB3cy5nZXRWYWxpZGF0b3JzKCkpewotCQkJYm9vbGVhbiBlbmFibGUgPSB2LmdldFZhbGlkYXRvckNsYXNzbmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQxIik7Ci0JCQl2LnNldEJ1aWxkVmFsaWRhdGlvbihlbmFibGUpOwotCQkJdi5zZXRNYW51YWxWYWxpZGF0aW9uKGVuYWJsZSk7Ci0JCX0KLQkJdmYuYXBwbHlDaGFuZ2VzKHdzLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlfZW52LmRpc3Bvc2UoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZ1bGxCdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRpb25GcmFtZXdvcmsgdmYgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKTsKLS8vCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcihfZmlyc3RUZXN0MngpOwotLy8JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQl0cnkgewotLy8JCQl3b3Jrc3BhY2UuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJX2Vudi5mdWxsQnVpbGQyKG1vbml0b3IpOwotCQkJCi0JCQl2Zi5qb2luKG1vbml0b3IpOwotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJCi0JCQlUMUdyb3VwLmdldEdyb3VwKCkucmVzZXQoKTsKLQkJCV9lbnYudHVybk9uQXV0b0J1aWxkKCk7Ci0JCQkKLQkJCQotCQkJX2ZpcnN0VGVzdDEudG91Y2gobW9uaXRvcik7Ci0JCQlUaHJlYWQuc2xlZXAoNTApOwotCQkJX3NlY29uZFRlc3QxLnRvdWNoKG1vbml0b3IpOwotCQkJdmYuam9pbihtb25pdG9yKTsKLQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCQotCQkJY2hlY2tDbGVhcigpOwotCQkJY2hlY2tUMUIoKTsKLQkJCWNoZWNrR3VhcmRWYWxpZGF0b3JzKCk7Ci0JCQkKLQkJCWNoZWNrVDFDKCk7Ci0JCQljaGVja0dyb3VwKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0vLwkJCXdvcmtzcGFjZS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2hlY2tHcm91cCgpIHsKLQkJVDFHcm91cCBncm91cCA9IFQxR3JvdXAuZ2V0R3JvdXAoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHZhbGlkYXRpb24gZ3JvdXAgbGlzdGVuZXIgVDFHcm91cCB3YXMgbmV2ZXIgY3JlYXRlZCIsIGdyb3VwKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgc3RhcnRpbmcgY291bnQgbXVzdCBlcXVhbCB0aGUgZmluaXNoaW5nIGNvdW50IiwgZ3JvdXAuZ2V0U3RhcnRpbmcoKSwgZ3JvdXAuZ2V0RmluaXNoaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk51bWJlciBvZiB0aW1lcyB0aGUgZ3JvdXAgc2hvdWxkIGJlIHNpZ25hbGxlZCIsIDIsIGdyb3VwLmdldFN0YXJ0aW5nKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1QxQigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBfZmlyc3RUMUIuZmluZE1hcmtlcnMoVDFCLk1hcmtlcklkLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQlhc3NlcnRFcXVhbHMoIk51bWJlciBvZiBUMUIgbWFya2VycyIsIDMsIG1hcmtlcnMubGVuZ3RoKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2hlY2tUMUMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gX2ZpcnN0VDFDLmZpbmRNYXJrZXJzKG51bGwsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCWFzc2VydEVxdWFscygiTnVtYmVyIG9mIFQxQyBtYXJrZXJzIiwgMCwgbWFya2Vycy5sZW5ndGgpOwkJCi0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGNsZWFyIGZ1bmN0aW9uIHdvcmtlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tDbGVhcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBfZmlyc3RUZXN0MnguZmluZE1hcmtlcnMoVmFsQ29uc3RhbnRzLlByb2JsZW1NYXJrZXIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCWFzc2VydEVxdWFscygxLCBtYXJrZXJzLmxlbmd0aCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja0d1YXJkVmFsaWRhdG9ycygpewotCQlCdW5kbGUgYiA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLmd1YXJkIik7Ci0JCWlmIChiICE9IG51bGwpewotCQkJaW50IHN0YXRlID0gYi5nZXRTdGF0ZSgpOwotCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpewotCQkJCWZhaWwoIlRoZSBndWFyZCBwbHVnLWluIHNob3VsZCBuZXZlciBiZSBhY3RpdmF0ZWQuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXByaXZhdGUgSVJlc291cmNlIF9pbnRlcmVzdGVkOwotCQkKLQkJcHVibGljIExpc3RlbmVyKElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCQlfaW50ZXJlc3RlZCA9IHJlc291cmNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJTWFya2VyRGVsdGFbXSBtYXJrZXJzID0gZXZlbnQuZmluZE1hcmtlckRlbHRhcyhWYWxDb25zdGFudHMuUHJvYmxlbU1hcmtlciwgZmFsc2UpOwotCQkJZm9yIChJTWFya2VyRGVsdGEgbWFya2VyIDogbWFya2Vycyl7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gbWFya2VyLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKF9pbnRlcmVzdGVkLmVxdWFscyhyZXNvdXJjZSkpewotCQkJCQkvLyBhZGRlZD0xLCByZW1vdmVkPTIsIGNoYW5nZWQ9NAotLy8JCQkJCWludCBraW5kID0gbWFya2VyLmdldEtpbmQoKTsKLS8vCQkJCQlNYXAgbWFwID0gbWFya2VyLmdldEF0dHJpYnV0ZXMoKTsKLS8vCQkJCQlpbnQgbGVuID0gbWFwLnNpemUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzhjYTEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMudGVzdGNhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdFN1aXRlMyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIFRlc3RFbnZpcm9ubWVudCBfZW52OwotCXByaXZhdGUgSVByb2plY3QJCV90ZXN0UHJvamVjdDsKLQkKLQlwcml2YXRlIElSZXNvdXJjZQlfZm9sZGVyOwotCXByaXZhdGUgSUZpbGUJCV9maXJzdFRlc3QxOwotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFN1aXRlMy5jbGFzcyk7Ci0JfSAKLQkKLQlwdWJsaWMgVGVzdFN1aXRlMyhTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCV9lbnYgPSBuZXcgVGVzdEVudmlyb25tZW50KCk7Ci0JCV90ZXN0UHJvamVjdCA9IF9lbnYuZmluZFByb2plY3QoIlRlc3RQcm9qZWN0Iik7Ci0JCWlmIChfdGVzdFByb2plY3QgIT0gbnVsbClyZXR1cm47Ci0JCV9lbnYudHVybm9mZkF1dG9CdWlsZCgpOwotCQllbmFibGVPbmx5VGVzdFZhbGlkYXRvcnMoKTsKLQkJX3Rlc3RQcm9qZWN0ID0gX2Vudi5jcmVhdGVQcm9qZWN0KCJUZXN0UHJvamVjdCIpOwotCQlJUGF0aCBmb2xkZXIgPSBfZW52LmFkZEZvbGRlcihfdGVzdFByb2plY3QuZ2V0RnVsbFBhdGgoKSwgInNvdXJjZSIpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZm9sZGVyKTsKLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgImZpcnN0LnRlc3QxIiwgImluY2x1ZGUgbWFwLnRlc3QxXG4iICsKLQkJCSJpbmZvIC0gaW5mb3JtYXRpb25cbiIgKwotCQkJIndhcm5pbmcgLSB3YXJuaW5nXG4iICsKLQkJCSJlcnJvciAtIGVycm9yXG5cbiIgKwotCQkJInQxZXJyb3IgLSBleHRyYSBlcnJvclxuIiArCi0JCQkidDF3YXJuaW5nIC0gZXh0cmEgd2FybmluZyIpOwotCQlfZW52LmFkZEZpbGUoZm9sZGVyLCAic2Vjb25kLnRlc3QxIiwgImluZm8gLSBpbmZvcm1hdGlvblxuIiArCi0JCQkid2FybmluZyAtIHdhcm5pbmdcbiIgKwotCQkJImVycm9yIC0gZXJyb3JcblxuIiArCi0JCQkidDFlcnJvciAtIGV4dHJhIGVycm9yXG4iICsKLQkJCSJ0MXdhcm5pbmcgLSBleHRyYSB3YXJuaW5nIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJtYXAudGVzdDEiLCAKLQkJCSIjIHdpbGwgaG9sZCBmdXR1cmUgbWFwcGluZ3NcblxuIiArCi0JCQkiIyBzeW50YXg6IG1hcCB0YXJnZXQgcmVwbGFjZW1lbnRcbiIgKwotCQkJIiMgZm9yIGV4YW1wbGUgbWFwIHQxZXJyb3IgZXJyb3IgLSB3b3VsZCByZXBsYWNlIGFsbCB0MWVycm9yIHRva2VucyB3aXRoIGVycm9yIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmaXJzdC50ZXN0MiIsICIjIHNhbXBsZSBmaWxlIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJ0aGlyZC50ZXN0NCIsIAotCQkJIiMgRG9lc24ndCByZWFsbHkgbWF0dGVyXG4iICsKLQkJCSIjIFdlIGp1c3Qgd2FudCB0byBtYWtlIHRoZSBidWlsZCBhIGJpdCBzbG93ZXIuIik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmb3VydGgudGVzdDQiLCAiIyBEb2Vzbid0IHJlYWxseSBtYXR0ZXIiKTsKLQkJX2Vudi5hZGRGaWxlKGZvbGRlciwgImZpZnRoLnRlc3Q1IiwgIiMgRG9lc24ndCByZWFsbHkgbWF0dGVyIik7Ci0JCQotCQlmb2xkZXIgPSBfZW52LmFkZEZvbGRlcihfdGVzdFByb2plY3QuZ2V0RnVsbFBhdGgoKSwgRmlsZU5hbWVzLmRpc2FibGVkKTsKLQkJX2ZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmb2xkZXIpOwotCQlfZmlyc3RUZXN0MSA9IF9lbnYuYWRkRmlsZShmb2xkZXIsICJmaXJzdC50ZXN0MSIsICJpbmNsdWRlIG1hcC50ZXN0MVxuIiArCi0JCQkJImluZm8gLSBpbmZvcm1hdGlvblxuIiArCi0JCQkJIndhcm5pbmcgLSB3YXJuaW5nXG4iICsKLQkJCQkiZXJyb3IgLSBlcnJvclxuXG4iICsKLQkJCQkidDFlcnJvciAtIGV4dHJhIGVycm9yXG4iICsKLQkJCQkidDF3YXJuaW5nIC0gZXh0cmEgd2FybmluZyIpOwotCi0JfQotCQotCS8qKgotCSAqIFNpbmNlIG90aGVyIHBsdWctaW5zIGNhbiBhZGQgYW5kIHJlbW92ZSB2YWxpZGF0b3JzLCB0dXJuIG9mZiBhbGwgdGhlIG9uZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YKLQkgKiB0aGVzZSB0ZXN0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGVuYWJsZU9ubHlUZXN0VmFsaWRhdG9ycygpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlNdXRhYmxlV29ya3NwYWNlU2V0dGluZ3Mgd3MgPSB2Zi5nZXRXb3Jrc3BhY2VTZXR0aW5ncygpOwotCQlmb3IgKElNdXRhYmxlVmFsaWRhdG9yIHYgOiB3cy5nZXRWYWxpZGF0b3JzKCkpewotCQkJYm9vbGVhbiBlbmFibGUgPSB2LmdldFZhbGlkYXRvckNsYXNzbmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3QiKTsKLQkJCXYuc2V0QnVpbGRWYWxpZGF0aW9uKGVuYWJsZSk7Ci0JCQl2LnNldE1hbnVhbFZhbGlkYXRpb24oZW5hYmxlKTsKLQkJfQotCQl2Zi5hcHBseUNoYW5nZXMod3MsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCV9lbnYuZGlzcG9zZSgpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGVzdDEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlUcmFjaW5nLmxvZygiVGVzdFN1aXRlMy0wMTogdGVzdFRlc3QxIHN0YXJ0aW5nIik7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CQkKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQkKLQkJdmYuZGlzYWJsZVZhbGlkYXRpb24oX2ZvbGRlcik7CQkKLQkJX2Vudi5mdWxsQnVpbGQobW9uaXRvcik7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gX2ZpcnN0VGVzdDEuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBmaWxlIHNob3VsZCBub3QgaGF2ZSBiZWVuIHZhbGlkYXRlZC4iLCAwLCBtYXJrZXJzLmxlbmd0aCk7Ci0JCQotCQl2Zi5lbmFibGVWYWxpZGF0aW9uKF9mb2xkZXIpOwotCQlfZW52LmZ1bGxCdWlsZChtb25pdG9yKTsJCQotCQltYXJrZXJzID0gX2ZpcnN0VGVzdDEuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQlhc3NlcnRUcnVlKCJUaGUgZmlsZSBzaG91bGQgaGF2ZSBzb21lIG1hcmtlcnMiLCBtYXJrZXJzLmxlbmd0aCA+IDApOwotCQkKLQkJdmYuZGlzYWJsZVZhbGlkYXRpb24oX2ZvbGRlcik7CQkJCQotCQlfZW52LmZ1bGxCdWlsZChtb25pdG9yKTsKLQkJbWFya2VycyA9IF9maXJzdFRlc3QxLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgZmlsZSBzaG91bGQgbm90IGhhdmUgYmVlbiB2YWxpZGF0ZWQuIiwgMCwgbWFya2Vycy5sZW5ndGgpOwotCQkKLQkJVHJhY2luZy5sb2coIlRlc3RTdWl0ZTMtMDI6dGVzdFRlc3QxIGZpbmlzaGVkIik7Ci0JfQotCQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlNC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MjdkNGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGU0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy50ZXN0Y2FzZTsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JTXV0YWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5NdXRhYmxlV29ya3NwYWNlU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdFN1aXRlNCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIFRlc3RFbnZpcm9ubWVudCBfZW52OwotCXByaXZhdGUgSVByb2plY3QJCV9wcm9qZWN0OwotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFN1aXRlNC5jbGFzcyk7Ci0JfSAKLQkKLQlwdWJsaWMgVGVzdFN1aXRlNChTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCV9lbnYgPSBuZXcgVGVzdEVudmlyb25tZW50KCk7Ci0JCUlGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IHByb2plY3QgPSBGYWNldGVkUHJvamVjdEZyYW1ld29yay5jcmVhdGVOZXdQcm9qZWN0KCk7Ci0JCXByb2plY3Quc2V0UHJvamVjdE5hbWUoIkZhY2V0UHJvamVjdCIpOwotCQlJUHJvamVjdEZhY2V0IHBmID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuamF2YSIpOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBpcHYgPSBwZi5nZXRWZXJzaW9uKCI1LjAiKTsKLQkJU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBzZXQgPSBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4oMSk7Ci0JCXNldC5hZGQoaXB2KTsKLQkJcHJvamVjdC5zZXRQcm9qZWN0RmFjZXRzKHNldCk7Ci0JCXByb2plY3QuY29tbWl0Q2hhbmdlcyhudWxsKTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCi0JCUlQYXRoIGZvbGRlciA9IF9lbnYuYWRkRm9sZGVyKF9wcm9qZWN0LmdldEZ1bGxQYXRoKCksICJzb3VyY2UiKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGZvbGRlcik7Ci0JCV9lbnYuYWRkRmlsZShmb2xkZXIsICJmaXJzdC50ZXN0MSIsIAotCQkJImluZm8gLSBpbmZvcm1hdGlvblxuIiArCi0JCQkid2FybmluZyAtIHdhcm5pbmdcbiIgKwotCQkJImVycm9yIC0gZXJyb3JcblxuIiArCi0JCQkidDFlcnJvciAtIGV4dHJhIGVycm9yXG4iICsKLQkJCSJ0MXdhcm5pbmcgLSBleHRyYSB3YXJuaW5nIik7Ci0JCQotCQllbmFibGVPbmx5VDRWYWxpZGF0b3JzKCk7Ci0JfQotCQotCS8qKgotCSAqIFNpbmNlIG90aGVyIHBsdWctaW5zIGNhbiBhZGQgYW5kIHJlbW92ZSB2YWxpZGF0b3JzLCB0dXJuIG9mZiBhbGwgdGhlIG9uZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YKLQkgKiB0aGVzZSB0ZXN0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGVuYWJsZU9ubHlUNFZhbGlkYXRvcnMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRpb25GcmFtZXdvcmsgdmYgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKTsKLQkJTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIHdzID0gdmYuZ2V0V29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJZm9yIChJTXV0YWJsZVZhbGlkYXRvciB2IDogd3MuZ2V0VmFsaWRhdG9ycygpKXsKLQkJCWJvb2xlYW4gZW5hYmxlID0gdi5nZXRWYWxpZGF0b3JDbGFzc25hbWUoKS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UNCIpOwotCQkJdi5zZXRCdWlsZFZhbGlkYXRpb24oZW5hYmxlKTsKLQkJCXYuc2V0TWFudWFsVmFsaWRhdGlvbihlbmFibGUpOwotCQl9Ci0JCXZmLmFwcGx5Q2hhbmdlcyh3cywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJX3Byb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOwotCQlfZW52LmRpc3Bvc2UoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlIHRoYXQgdGhlIGZhY2V0IHZlcnNpb24gZXhwcmVzc2lvbnMgYXJlIHdvcmtpbmcuIFdlIGRlZmluZSB0d28gdmFsaWRhdG9ycyBUNEEgYW5kIFQ0Qi4gVGhlIGZpcnN0IG9uZSBvcGVyYXRlcyBvbiBKYXZhIDUKLQkgKiBhbmQgdGhlIHNlY29uZCBvbiBKYXZhIDYuIFNpbmNlIHdlIGhhdmUgY3JlYXRlZCBhIHByb2plY3QgdGhhdCBoYXMgYmVlbiBzZXQgdG8gSmF2YSA1LCB3ZSBvbmx5IGV4cGVjdCB0aGUgVDRBIHZhbGlkYXRvcgotCSAqIHRvIGJlIGNhbGxlZC4gCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZhY2V0VmVyc2lvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlUcmFjaW5nLmxvZygiVGVzdFN1aXRlNC0wMTogdGVzdEZhY2V0VmVyc2lvbnMgc3RhcnRpbmciKTsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsJCQotCQlWYWxpZGF0aW9uRnJhbWV3b3JrIHZmID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbMV07Ci0JCXByb2plY3RzWzBdID0gX3Byb2plY3Q7Ci0JCVZhbGlkYXRpb25SZXN1bHRzIHZyID0gdmYudmFsaWRhdGUocHJvamVjdHMsIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJaW50IGVycm9ycyA9IHZyLmdldFNldmVyaXR5RXJyb3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgZXJyb3JzIiwgMSwgZXJyb3JzKTsKLQkJCQkKLQkJVHJhY2luZy5sb2coIlRlc3RTdWl0ZTQtMDI6dGVzdEZhY2V0VmVyc2lvbnMgZmluaXNoZWQiKTsKLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGU1LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0NWI0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMudGVzdGNhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRyYWNpbmc7Ci0KLS8qKiBUZXN0IHRoZSBuZXcgcGF0dGVybiBydWxlLiAqLwotcHVibGljIGNsYXNzIFRlc3RTdWl0ZTUgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKLQlwcml2YXRlIElQcm9qZWN0CQlfcHJvamVjdDsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RTdWl0ZTUuY2xhc3MpOwotCX0gCi0JCi0JcHVibGljIFRlc3RTdWl0ZTUoU3RyaW5nIG5hbWUpewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlfZW52ID0gbmV3IFRlc3RFbnZpcm9ubWVudCgpOwotCQlfcHJvamVjdCA9IF9lbnYuY3JlYXRlUHJvamVjdCgiVGVzdFN1aXRlNSIpOwotCQkKLQkJSVBhdGggZmlyc3QgPSBfZW52LmFkZEZvbGRlcihfcHJvamVjdC5nZXRGdWxsUGF0aCgpLCAiZmlyc3QiKTsKLQkJSVBhdGggc2Vjb25kID0gX2Vudi5hZGRGb2xkZXIoZmlyc3QsICJzZWNvbmQiKTsKLQkJSVBhdGggdGhpcmQgPSBfZW52LmFkZEZvbGRlcihzZWNvbmQsICJ0aGlyZCIpOwotCQlfZW52LmFkZEZpbGUodGhpcmQsICJzYW1wbGUudGVzdDEiLCAKLQkJCSJpbmZvIC0gaW5mb3JtYXRpb25cbiIgKwotCQkJIndhcm5pbmcgLSB3YXJuaW5nXG4iICsKLQkJCSJlcnJvciAtIGVycm9yXG5cbiIgKwotCQkJInQxZXJyb3IgLSBleHRyYSBlcnJvclxuIiArCi0JCQkidDF3YXJuaW5nIC0gZXh0cmEgd2FybmluZyIpOwotCQkKLQkJVGVzdEVudmlyb25tZW50LmVuYWJsZU9ubHlUaGVzZVZhbGlkYXRvcnMoIlQ1Iik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCV9wcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJX2Vudi5kaXNwb3NlKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZSB0aGF0IHRoZSBwYXR0ZXJuIGZpbHRlcnMgYXJlIHdvcmtpbmcuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFBhdHRlcm5zKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJVHJhY2luZy5sb2coIlRlc3RTdWl0ZTUtMDE6IHRlc3RGYWNldFZlcnNpb25zIHN0YXJ0aW5nIik7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CQkKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElQcm9qZWN0WzFdOwotCQlwcm9qZWN0c1swXSA9IF9wcm9qZWN0OwotCQlWYWxpZGF0aW9uUmVzdWx0cyB2ciA9IHZmLnZhbGlkYXRlKHByb2plY3RzLCB0cnVlLCBmYWxzZSwgbW9uaXRvcik7Ci0JCWludCBlcnJvcnMgPSB2ci5nZXRTZXZlcml0eUVycm9yKCk7Ci0JCWFzc2VydEVxdWFscygiTnVtYmVyIG9mIGVycm9ycyIsIDEsIGVycm9ycyk7Ci0JCQkJCi0JCVRyYWNpbmcubG9nKCJUZXN0U3VpdGU1LTAyOnRlc3RGYWNldFZlcnNpb25zIGZpbmlzaGVkIik7Ci0JfQotCQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlNi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGU2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZGQ4MjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGU2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLnRlc3RjYXNlOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UNkE7Ci0KLS8qKiBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgZGVwZW5kZW50IHJlc291cmNlIGlzIGRlbGV0ZWQuICovCi1wdWJsaWMgY2xhc3MgVGVzdFN1aXRlNiBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIFRlc3RFbnZpcm9ubWVudCBfZW52OwotCXByaXZhdGUgSVByb2plY3QJCV9wcm9qZWN0OwotCXByaXZhdGUgSUZpbGUJCQlfc2FtcGxlOwotCXByaXZhdGUJSUZpbGUJCQlfbWFzdGVyOwotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFN1aXRlNi5jbGFzcyk7Ci0JfSAKLQkKLQlwdWJsaWMgVGVzdFN1aXRlNihTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCV9lbnYgPSBuZXcgVGVzdEVudmlyb25tZW50KCk7Ci0JCV9lbnYudHVybm9mZkF1dG9CdWlsZCgpOwotCQlfcHJvamVjdCA9IF9lbnYuY3JlYXRlUHJvamVjdCgiVGVzdFN1aXRlNiIpOwotCQkKLQkJSVBhdGggZmlyc3QgPSBfZW52LmFkZEZvbGRlcihfcHJvamVjdC5nZXRGdWxsUGF0aCgpLCAiZmlyc3QiKTsKLQkJX3NhbXBsZSA9IF9lbnYuYWRkRmlsZShmaXJzdCwgInNhbXBsZS50NmEiLAkiaW5jbHVkZSBtYXN0ZXIudDZhIik7CQkKLQkJX21hc3RlciA9IF9lbnYuYWRkRmlsZShmaXJzdCwgIm1hc3Rlci50NmEiLCAiIyBhIGR1bW15IGZpbGUiKTsKLQkJCi0JCVRlc3RFbnZpcm9ubWVudC5lbmFibGVPbmx5VGhpc1ZhbGlkYXRvcigib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDZBIik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCV9wcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJX2Vudi5kaXNwb3NlKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZSB0aGF0IHRoZSB2YWxpZGF0b3IgZ2V0cyBjYWxsZWQgd2hlbiBhIGRlcGVuZGVudCByZXNvdXJjZSBpcyBkZWxldGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlUcmFjaW5nLmxvZygiVGVzdFN1aXRlNi0wMTogdGVzdERlbGV0ZSBzdGFydGluZyIpOwotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwkKLQkJVDZBLnJlc2V0Q291bnRlcnMoKTsKLQkJCi0JCV9lbnYuaW5jcmVtZW50YWxCdWlsZEFuZFdhaXQobW9uaXRvcik7Ci0JCWFzc2VydEVxdWFscygiV2UgZG8gbm90IGV4cGVjdCBhbnkgZXJyb3JzIGJ5IHRoaXMgcG9pbnQiLCAwLCBfZW52LmdldEVycm9ycyhfc2FtcGxlKSk7Ci0JCQotCQlfbWFzdGVyLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLQkJX2Vudi5pbmNyZW1lbnRhbEJ1aWxkQW5kV2FpdChtb25pdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbWlzc2luZyBkZXBlbmVuY3kgc2hvdWxkIGhhdmUgYmVlbiByZXBvcnRlZC4iLCAxLCBfZW52LmdldEVycm9ycyhfc2FtcGxlKSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHNpbXBsZSB2ZXJzaW9uIG9mIHRoZSB2YWxpZGF0ZSBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIsIDAsIFQ2QS5nZXRDb3VudFNpbXBsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGNvbXBsZXggbWV0aG9kIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UiLCBUNkEuZ2V0Q291bnRDb21wbGV4KCkgPiAwKTsKLQkJCQkJCi0JCVRyYWNpbmcubG9nKCJUZXN0U3VpdGU2LTAyOnRlc3REZWxldGUgZmluaXNoZWQiKTsKLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGU3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyMzUwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMudGVzdGNhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlQ3QTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy5UN0EuVmFsRW50cnlQb2ludDsKLQotLyoqIFRlc3QgdGhlIG9yZGVyIG9mIHZhbGlkYXRpb24gZXZlbnRzLiAqLwotcHVibGljIGNsYXNzIFRlc3RTdWl0ZTcgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKLQlwcml2YXRlIElQcm9qZWN0CQlfcHJvamVjdEE7Ci0JcHJpdmF0ZSBJUHJvamVjdAkJX3Byb2plY3RCOwotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFN1aXRlNy5jbGFzcyk7Ci0JfSAKLQkKLQlwdWJsaWMgVGVzdFN1aXRlNyhTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVRlc3RFbnZpcm9ubWVudC5lbmFibGVPbmx5VGhpc1ZhbGlkYXRvcigib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMuVDdBIik7Ci0JCV9lbnYgPSBuZXcgVGVzdEVudmlyb25tZW50KCk7Ci0JCV9wcm9qZWN0QSA9IF9lbnYuY3JlYXRlUHJvamVjdCgiVGVzdFN1aXRlN2EiKTsKLQkJX3Byb2plY3RCID0gX2Vudi5jcmVhdGVQcm9qZWN0KCJUZXN0U3VpdGU3YiIpOwotCQltYWtlRmlsZXMoX3Byb2plY3RBKTsKLQkJbWFrZUZpbGVzKF9wcm9qZWN0Qik7Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWFrZUZpbGVzKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb257Ci0JCUlQYXRoIGZpcnN0ID0gX2Vudi5hZGRGb2xkZXIocHJvamVjdC5nZXRGdWxsUGF0aCgpLCAic29tZS1mb2xkZXIiKTsKLQkJX2Vudi5hZGRGaWxlKGZpcnN0LCAiZmlyc3QudDdhIiwJIiMgYSBkdW1teSBmaWxlIik7CQkKLQkJX2Vudi5hZGRGaWxlKGZpcnN0LCAic2Vjb25kLnQ3YSIsICIjIGEgZHVtbXkgZmlsZSIpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJX3Byb2plY3RBLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJX3Byb2plY3RCLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJX2Vudi5kaXNwb3NlKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhlIG9yZGVyIG9mIGEgY2xlYW4gYnVpbGQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENsZWFuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJVHJhY2luZy5sb2coIlRlc3RTdWl0ZTctMDE6IHRlc3RDbGVhbiBzdGFydGluZyIpOwotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwkKLQkJX2Vudi50dXJuT25BdXRvQnVpbGQoKTsKLQkJX2Vudi5jbGVhbkJ1aWxkKG1vbml0b3IpOwotCQlUN0EucmVzZXRMaXN0KCk7Ci0JCQotCQlfZW52LmNsZWFuQnVpbGQobW9uaXRvcik7Ci0JCVZhbEVudHJ5UG9pbnRbXSBhcnJheSA9IFQ3QS5nZXRBcnJheSgpOwotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgZmluaXNoID0gMDsKLQkJZm9yIChWYWxFbnRyeVBvaW50IHZlcCA6IGFycmF5KXsKLQkJCXN3aXRjaCAodmVwLmdldFR5cGUoKSl7Ci0JCQljYXNlIFN0YXJ0aW5nOgotCQkJCWlmIChzdGFydCA9PSAwKWFzc2VydE51bGwoIkZpcnN0IHN0YXJ0aW5nIGVudHJ5IG11c3QgYmUgbnVsbCIsIHZlcC5nZXRSZXNvdXJjZSgpKTsKLQkJCQlzdGFydCsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGaW5pc2hpbmc6Ci0JCQkJZmluaXNoKys7Ci0JCQkJYnJlYWs7CQkKLQkJCWNhc2UgTm9ybWFsOgotCQkJCWFzc2VydEVxdWFscygiQWxsIG5vcm1hbCB2YWxpZGF0aW9uIGV2ZW50cyBtdXN0IGJlIHR3byBsZXZlbHMgZGVlcCIsIDIsIHN0YXJ0LWZpbmlzaCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJTdGFydGluZyBtdXN0IGVxdWFsIGZpbmlzaGluZyIsIHN0YXJ0LCBmaW5pc2gpOwotCQlhc3NlcnROdWxsKCJMYXN0IGVudHJ5IG11c3QgYmUgbnVsbCIsIGFycmF5W2FycmF5Lmxlbmd0aC0xXS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCVRyYWNpbmcubG9nKCJUZXN0U3VpdGU3LTAyOnRlc3RDbGVhbiBmaW5pc2hlZCIpOwotCX0KLQkKLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTguamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjM5OTNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVGVzdFN1aXRlOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMudGVzdGNhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLklNdXRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk11dGFibGVQcm9qZWN0U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKiogCi0gKiBUZXN0IHRoZSB0cmFuc2llbnQgc2V0dGluZ3Mgc3VwcG9ydC4gVGhhdCBpcyB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgdmFsaWRhdG9yIHNldHRpbmdzIHdpdGhvdXQgY2hhbmdpbmcKLSAqIHRoZSBwcm9wZXJ0eSBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdWl0ZTggZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKLQlwcml2YXRlIElQcm9qZWN0CQlfcHJvamVjdDsKLQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGVzdFN1aXRlOC5jbGFzcyk7Ci0JfSAKLQkKLQlwdWJsaWMgVGVzdFN1aXRlOChTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlfZW52ID0gbmV3IFRlc3RFbnZpcm9ubWVudCgpOwotCQlfZW52LnR1cm5vZmZBdXRvQnVpbGQoKTsKLQkJX3Byb2plY3QgPSBfZW52LmNyZWF0ZVByb2plY3QoIlRlc3RTdWl0ZTgiKTsKLQkJSVBhdGggZmlyc3QgPSBfZW52LmFkZEZvbGRlcihfcHJvamVjdC5nZXRGdWxsUGF0aCgpLCAic29tZS1mb2xkZXIiKTsKLQkJX2Vudi5hZGRGaWxlKGZpcnN0LCAiZmlyc3QudDZhIiwgImVycm9yIC0gb25lIGVycm9yIGxpbmUiKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlfcHJvamVjdC5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCV9lbnYuZGlzcG9zZSgpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCQotCS8qKgotCSAqIFRlc3QgdGhlIHRyYW5zaWVudCBzZXR0aW5ncyBzdXBwb3J0LiBUaGF0IGlzIHRoZSBhYmlsaXR5IHRvIGNoYW5nZSB2YWxpZGF0b3Igc2V0dGluZ3Mgd2l0aG91dCBjaGFuZ2luZwotCSAqIHRoZSBwcm9wZXJ0eSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlUcmFjaW5nLmxvZygiVGVzdFN1aXRlOC0wMTogdGVzdENsZWFuIHN0YXJ0aW5nIik7Ci0JCQotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKTsKLQkJSVBhdGggcGF0aCA9IFBsYXRmb3JtLmdldFN0YXRlTG9jYXRpb24oYnVuZGxlKTsKLQkJcGF0aCA9IHBhdGguYXBwZW5kKCIuc2V0dGluZ3MvIitWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCsiLnByZWZzIik7Ci0JCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCi0JCVZhbGlkYXRpb25GcmFtZXdvcmsgdmYgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKTsKLQkJTXV0YWJsZVdvcmtzcGFjZVNldHRpbmdzIG13cyA9IHZmLmdldFdvcmtzcGFjZVNldHRpbmdzKCk7Ci0JCUlNdXRhYmxlVmFsaWRhdG9yW10gdmFsaWRhdG9ycyA9IG13cy5nZXRWYWxpZGF0b3JzKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIG11c3QgYmUgc2ltZSB2YWxpZGF0b3JzIGRlZmluZWQiLCB2YWxpZGF0b3JzLmxlbmd0aCA+IDApOwotCQlmb3IgKElNdXRhYmxlVmFsaWRhdG9yIHZhbCA6IHZhbGlkYXRvcnMpewotCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbihmYWxzZSk7Ci0JCQl2YWwuc2V0TWFudWFsVmFsaWRhdGlvbih0cnVlKTsKLQkJfQotCQl2Zi5hcHBseUNoYW5nZXMobXdzLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGdsb2JhbCBwcmVmZXJlbmNlIGZpbGUgc2hvdWxkIG5vdCBoYXZlIGNoYW5nZWQiLCBsYXN0TW9kaWZpZWQsIGZpbGUubGFzdE1vZGlmaWVkKCkpOwotCQkKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJVmFsaWRhdGlvblJlc3VsdHMgdnIgPSB2Zi52YWxpZGF0ZShuZXcgSVByb2plY3RbXXtfcHJvamVjdH0sIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJXZSBleHBlY3QgZXhhY3RseSBvbmUgZXJyb3IiLCAxLCB2ci5nZXRTZXZlcml0eUVycm9yKCkpOwotCQkKLQkJbXdzID0gdmYuZ2V0V29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJdmFsaWRhdG9ycyA9IG13cy5nZXRWYWxpZGF0b3JzKCk7Ci0JCWZvciAoSU11dGFibGVWYWxpZGF0b3IgdmFsIDogdmFsaWRhdG9ycyl7Ci0JCQlhc3NlcnRFcXVhbHMoIldlIGV4cGVjdGVkICIgKyB2YWwuZ2V0TmFtZSgpICsgIiB0byBoYXZlIGJ1aWxkIHR1cm5lZCBvZmYiLCBmYWxzZSwgdmFsLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXZSBleHBlY3RlZCAiICsgdmFsLmdldE5hbWUoKSArICIgdG8gaGF2ZSBtYW51YWwgdHVybmVkIG9uIiwgdHJ1ZSwgdmFsLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLQkJCQotCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbih0cnVlKTsKLQkJCXZhbC5zZXRNYW51YWxWYWxpZGF0aW9uKGZhbHNlKTsKLQkJfQotCQl2Zi5hcHBseUNoYW5nZXMobXdzLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGdsb2JhbCBwcmVmZXJlbmNlIGZpbGUgc2hvdWxkIGhhdmUgY2hhbmdlZCIsIGxhc3RNb2RpZmllZCA8IGZpbGUubGFzdE1vZGlmaWVkKCkpOwotCQkKLQkJdnIgPSB2Zi52YWxpZGF0ZShuZXcgSVByb2plY3RbXXtfcHJvamVjdH0sIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdmFsaWRhdG9yIGlzIG9mZiwgdGhlcmUgc2hvdWxkIGJlIG5vIGVycm9ycyIsIDAsIHZyLmdldFNldmVyaXR5RXJyb3IoKSk7Ci0JCQotCQlwcm9qZWN0VGVzdCgpOwotCQkJCQotCQlUcmFjaW5nLmxvZygiVGVzdFN1aXRlOC0wMjp0ZXN0Q2xlYW4gZmluaXNoZWQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvamVjdFRlc3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkRm9yUHJvamVjdCgpOwotCQkKLQkJVmFsaWRhdGlvbkZyYW1ld29yayB2ZiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCQkKLQkJTXV0YWJsZVByb2plY3RTZXR0aW5ncyBtcHMgPSB2Zi5nZXRQcm9qZWN0U2V0dGluZ3MoX3Byb2plY3QpOwotCQlhc3NlcnRGYWxzZSgiQnkgZGVmYXVsdCwgcHJvamVjdHMgY2FuIG5vdCBvdmVycmlkZSB3b3Jrc3BhY2Ugc2V0dGluZ3MiLCBtcHMuZ2V0T3ZlcnJpZGUoKSk7Ci0JCQotCQltcHMuc2V0T3ZlcnJpZGUodHJ1ZSk7Ci0JCXZmLmFwcGx5Q2hhbmdlcyhtcHMsIGZhbHNlKTsKLQkJCi0JCUlNdXRhYmxlVmFsaWRhdG9yW10gdmFsaWRhdG9ycyA9IG1wcy5nZXRWYWxpZGF0b3JzKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIG11c3QgYmUgc2ltZSB2YWxpZGF0b3JzIGRlZmluZWQiLCB2YWxpZGF0b3JzLmxlbmd0aCA+IDApOwotCQlmb3IgKElNdXRhYmxlVmFsaWRhdG9yIHZhbCA6IHZhbGlkYXRvcnMpewotCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbihmYWxzZSk7Ci0JCQl2YWwuc2V0TWFudWFsVmFsaWRhdGlvbih0cnVlKTsKLQkJfQotCQl2Zi5hcHBseUNoYW5nZXMobXBzLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3QgcHJlZmVyZW5jZSBmaWxlIHNob3VsZCBub3QgaGF2ZSBjaGFuZ2VkIiwgbGFzdE1vZGlmaWVkLCBsYXN0TW9kaWZpZWRGb3JQcm9qZWN0KCkpOwotCQkKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJVmFsaWRhdGlvblJlc3VsdHMgdnIgPSB2Zi52YWxpZGF0ZShuZXcgSVByb2plY3RbXXtfcHJvamVjdH0sIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJXZSBleHBlY3QgZXhhY3RseSBvbmUgZXJyb3IiLCAxLCB2ci5nZXRTZXZlcml0eUVycm9yKCkpOwotCQkKLQkJbXBzID0gdmYuZ2V0UHJvamVjdFNldHRpbmdzKF9wcm9qZWN0KTsKLQkJdmFsaWRhdG9ycyA9IG1wcy5nZXRWYWxpZGF0b3JzKCk7Ci0JCWZvciAoSU11dGFibGVWYWxpZGF0b3IgdmFsIDogdmFsaWRhdG9ycyl7Ci0JCQlhc3NlcnRFcXVhbHMoIldlIGV4cGVjdGVkICIgKyB2YWwuZ2V0TmFtZSgpICsgIiB0byBoYXZlIGJ1aWxkIHR1cm5lZCBvZmYiLCBmYWxzZSwgdmFsLmlzQnVpbGRWYWxpZGF0aW9uKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJXZSBleHBlY3RlZCAiICsgdmFsLmdldE5hbWUoKSArICIgdG8gaGF2ZSBtYW51YWwgdHVybmVkIG9uIiwgdHJ1ZSwgdmFsLmlzTWFudWFsVmFsaWRhdGlvbigpKTsKLQkJCQotCQkJdmFsLnNldEJ1aWxkVmFsaWRhdGlvbih0cnVlKTsKLQkJCXZhbC5zZXRNYW51YWxWYWxpZGF0aW9uKGZhbHNlKTsKLQkJfQotCQl2Zi5hcHBseUNoYW5nZXMobXBzLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHByb2plY3QgcHJlZmVyZW5jZSBmaWxlIHNob3VsZCBoYXZlIGNoYW5nZWQiLCBsYXN0TW9kaWZpZWQgPCBsYXN0TW9kaWZpZWRGb3JQcm9qZWN0KCkpOwotCQkKLQkJdnIgPSB2Zi52YWxpZGF0ZShuZXcgSVByb2plY3RbXXtfcHJvamVjdH0sIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdmFsaWRhdG9yIGlzIG9mZiwgdGhlcmUgc2hvdWxkIGJlIG5vIGVycm9ycyIsIDAsIHZyLmdldFNldmVyaXR5RXJyb3IoKSk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZEZvclByb2plY3QoKXsKLQkJbG9uZyBsYXN0TW9kaWZpZWQgPSAwOwotCQlJUmVzb3VyY2UgcHJlZnMgPSBfcHJvamVjdC5maW5kTWVtYmVyKCIuc2V0dGluZ3MvIiArIFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEICsgIi5wcmVmcyIpOwotCQlpZiAocHJlZnMgIT0gbnVsbCl7Ci0JCQlGaWxlIHBmID0gcHJlZnMuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJCWxhc3RNb2RpZmllZCA9IHBmLmxhc3RNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy90ZXN0Y2FzZS9UZXN0U3VpdGU5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhNGQzYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1Rlc3RTdWl0ZTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLnRlc3RjYXNlOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotCi0vKiogVGVzdHMgZm9yIGRlcml2ZWQgcmVzb3VyY2VzLiAqLwotcHVibGljIGNsYXNzIFRlc3RTdWl0ZTkgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBUZXN0RW52aXJvbm1lbnQgX2VudjsKLQlwcml2YXRlIElQcm9qZWN0CQlfcHJvamVjdDsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RTdWl0ZTkuY2xhc3MpOwotCX0gCi0JCi0JcHVibGljIFRlc3RTdWl0ZTkoU3RyaW5nIG5hbWUpewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJX2VudiA9IG5ldyBUZXN0RW52aXJvbm1lbnQoKTsKLQkJX3Byb2plY3QgPSBfZW52LmNyZWF0ZVByb2plY3QoIlRlc3RTdWl0ZTkiKTsKLQkJCi0JCUlQYXRoIGZpcnN0ID0gX2Vudi5hZGRGb2xkZXIoX3Byb2plY3QuZ2V0RnVsbFBhdGgoKSwgImZpcnN0Iik7Ci0JCUlGaWxlIGZpbGUgPSBfZW52LmFkZEZpbGUoZmlyc3QsICJ0ZXN0LnhtbCIsIAotCQkJIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+IiArCi0JCQkiPHJvb3Q+Iik7Ci0JCWZpbGUuc2V0RGVyaXZlZCh0cnVlKTsKLQkJCi0JCVRlc3RFbnZpcm9ubWVudC5lbmFibGVPbmx5VGhpc1ZhbGlkYXRvcigib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJX3Byb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOwotCQlfZW52LmRpc3Bvc2UoKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlIHRoYXQgdGhlIGZyYW1ld29yayBpZ25vcmVzIGRlcml2ZWQgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJZ25vcmVzRGVyaXZlZFJlc291cmNlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCVRyYWNpbmcubG9nKCJUZXN0U3VpdGU5LTAxOiB0ZXN0SWdub3Jlc0Rlcml2ZWRSZXNvdXJjZXMgc3RhcnRpbmciKTsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsJCQotCQlWYWxpZGF0aW9uRnJhbWV3b3JrIHZmID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBuZXcgSVByb2plY3RbMV07Ci0JCXByb2plY3RzWzBdID0gX3Byb2plY3Q7Ci0JCVZhbGlkYXRpb25SZXN1bHRzIHZyID0gdmYudmFsaWRhdGUocHJvamVjdHMsIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJaW50IGVycm9ycyA9IHZyLmdldFNldmVyaXR5RXJyb3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgZXJyb3JzIiwgMCwgZXJyb3JzKTsKLQkJCQkKLQkJVHJhY2luZy5sb2coIlRlc3RTdWl0ZTktMDI6IHRlc3RJZ25vcmVzRGVyaXZlZFJlc291cmNlcyBmaW5pc2hlZCIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL3Rlc3RjYXNlL1ZhbGlkYXRpb25UZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWYzMmU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvdGVzdGNhc2UvVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy50ZXN0Y2FzZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkKLSAgICBwdWJsaWMgVmFsaWRhdGlvblRlc3RTdWl0ZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSlWYWxpZGF0aW9uVGVzdFN1aXRlLnN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0cy50ZXN0Y2FzZSIpOwotCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZTEuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlMi5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChUZXN0U3VpdGUzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZTQuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlNS5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChUZXN0U3VpdGU2LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZTcuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlOC5zdWl0ZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChUZXN0U3VpdGU5LnN1aXRlKCkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDY0ZmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQuIC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi4iLz4gLS0+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gU2V0IHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMi4wL2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1YbXg3NjhNIi8+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoaXMgdGFyZ2V0IGluaXRpYWxpemVzIGFsbCBvZiB0aGUgdGVzdHMgdGhhdCB3aWxsIHJ1bi4gICAgICAgLS0+Ci0gIDwhLS0gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSAtLT4gCi0gIDwhLS0gYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgPHRzdGFtcC8+Ci0gICAgICA8ZGVsZXRlPgotICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcuKi54bWwiLz4KLSAgICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gcnVuLiAgICAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQk8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3dzdF92ZiIvPgotCTxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0JPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgCTxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICAJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLnRlc3RjYXNlLlZhbGlkYXRpb25UZXN0U3VpdGUiLz4KLSAgIAkgIAk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgCSAgCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0JPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgIC0tPgotICA8IS0tIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gICAgICAgLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZy4qLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL01pc2MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL01pc2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllY2FjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9NaXNjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogU29tZSBtaXNjZWxsYW5lb3VzIGhlbHBlciBtZXRob2RzLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaXNjIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBEYXRlRm9ybWF0IF9kZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJISDptbTpzcy5TU1NTIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSW5wdXRTdHJlYW0gaW4pewotCQlpZiAoaW4gPT0gbnVsbClyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpbi5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKE91dHB1dFN0cmVhbSBvdXQpIHsKLQkJaWYgKG91dCA9PSBudWxsKXJldHVybjsKLQkJdHJ5IHsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vIGVhdCBpdAotCQl9CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlzdE1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlKXsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwMDApOwotCQliLmFwcGVuZCgiTWFya2VycyBvbiAiKTsKLQkJYi5hcHBlbmQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYi5hcHBlbmQoJyAnKTsKLQkJdHJ5IHsKLQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJZm9yIChJTWFya2VyIG0gOiBtYXJrZXJzKXsKLQkJCQlPYmplY3QgbyA9IG0uZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0JCQkJaWYgKG8gIT0gbnVsbCl7Ci0JCQkJCWIuYXBwZW5kKG8pOwotCQkJCX0KLQkJCQlvID0gbS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7Ci0JCQkJaWYgKG8gIT0gbnVsbCl7Ci0JCQkJCWIuYXBwZW5kKCIsIFNldmVyaXR5PSIpOwotCQkJCQliLmFwcGVuZChvKTsKLQkJCQl9Ci0JCQkJYi5hcHBlbmQoIjsgIik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQkKLQkJfQotCQlyZXR1cm4gYi50b1N0cmluZygpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGltZXN0YW1wSXQoU3RyaW5nIGxpbmUpewotCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotCQlsb25nIHRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIF9kZi5mb3JtYXQoZGF0ZSkgKyAiICIgKyB0aHJlYWQgKyAiICIgKyBsaW5lOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBuaXkoU3RyaW5nIG1zZyl7Ci0JCWlmIChtc2cgPT0gbnVsbCltc2cgPSAiU29ycnksIHRoaXMgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIHlldCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UMUFWYWxpZGF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QxQVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTg3YzRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QxQVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHMudGVzdGNhc2UuRmlsZU5hbWVzOwotCi0vKioKLSAqIFRlc3QgdmFsaWRhdGluZyBhIHNpZGUgZmlsZS4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUMUFWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWQoKXsKLQkJcmV0dXJuIEFjdGl2YXRvci5QTFVHSU5fSUQgKyIuVDFBIjsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlUcmFjaW5nLmxvZygiVDFBVmFsaWRhdG9yLTAxOiBpcyB2YWxpZGF0aW5nOiAiICsgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCWNsZWFyVGVzdChyZXNvdXJjZS5nZXRQcm9qZWN0KCksIHZyKTsKLQkJcmV0dXJuIHZyOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJUZXN0KElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25SZXN1bHQgdnIpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5maW5kTWVtYmVyKCJzb3VyY2UvIiArIEZpbGVOYW1lcy5maXJzdFRlc3QyeCk7Ci0JCXRyeSB7Ci0JCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5jbGVhck1lc3NhZ2VzKHJlc291cmNlLCBpZCgpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCVN0cmluZyBtc2cgPSBUcmFjaW5nLnRpbWVzdGFtcEl0KCJTaWRlIGVmZmVjdCB2YWxpZGF0aW9uIGZyb20gVDFBIik7Ci0JCVZhbGlkYXRvck1lc3NhZ2Ugdm0gPSBWYWxpZGF0b3JNZXNzYWdlLmNyZWF0ZShtc2csIHJlc291cmNlKTsKLQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIDEpOwotCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCXZyLmFkZCh2bSk7CQotCQl2ci5zZXRWYWxpZGF0ZWQobmV3IElSZXNvdXJjZVtde3Jlc291cmNlfSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJcmV0dXJuIGlkKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpewotCQlyZXR1cm4gIlQxQVZhbGlkYXRvciI7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDFCLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UMUIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlMDcwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UMUIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlOwotCi0vKioKLSAqIFVzZWQgdG8gdGVzdCBjdXN0b20gbWFya2Vycy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUMUIgZXh0ZW5kcyBUZXN0VmFsaWRhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1hcmtlcklkID0gQWN0aXZhdG9yLlBMVUdJTl9JRCsiLnQxYm1hcmtlciI7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWQoKXsKLQkJcmV0dXJuIEFjdGl2YXRvci5QTFVHSU5fSUQgKyIuVDFCIjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IHN1cGVyLnZhbGlkYXRlKHJlc291cmNlLCBraW5kLCBzdGF0ZSwgbW9uaXRvcik7Ci0JCQotCQlmb3IgKFZhbGlkYXRvck1lc3NhZ2Ugdm0gOiB2ci5nZXRNZXNzYWdlcygpKXsKLQkJCXZtLnNldFR5cGUoTWFya2VySWQpOwotCQl9Ci0JCXJldHVybiB2cjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UMUMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QxQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzdlZTYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QxQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci0KLS8qKgotICogQSB2YWxpZGF0b3IgdGhhdCBpcyB1c2VkIHRvIHRlc3QgdGhlIGZvbGRlciBmaWx0ZXJzLgotICogCi0gKiBJdCBsb29rcyBhdCBmaWxlcyB3aXRoIGEgZmlsZSBleHRlbnNpb24gb2YgdDFjLgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFQxQyBleHRlbmRzIFRlc3RWYWxpZGF0b3IgewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkKCl7Ci0JCXJldHVybiBBY3RpdmF0b3IuUExVR0lOX0lEICsiLlQxQyI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiVDFDIjsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UMUdyb3VwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UMUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjlkYzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDFHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5JVmFsaWRhdG9yR3JvdXBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci0KLXB1YmxpYyBjbGFzcyBUMUdyb3VwIGltcGxlbWVudHMgSVZhbGlkYXRvckdyb3VwTGlzdGVuZXIgewotCQotCXByaXZhdGUgaW50IF9zdGFydGluZzsKLQlwcml2YXRlIGludAlfZmluaXNoaW5nOwotCXByaXZhdGUgc3RhdGljIFQxR3JvdXAgX21lOwotCQotCXB1YmxpYyBzdGF0aWMgVDFHcm91cCBnZXRHcm91cCgpewotCQlyZXR1cm4gX21lOwotCX0KLQkKLQlwdWJsaWMgVDFHcm91cCgpewotCQlpZiAoX21lICE9IG51bGwpdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiT25seSBvbmUgaW5zdGFuY2UgY2FuIGJlIGNvbnN0cnVjdGVkLiIpOwotCQlfbWUgPSB0aGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVJlc291cmNlIHJlc291cmNlLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUpIHsKLQkJX3N0YXJ0aW5nKys7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVJlc291cmNlIHJlc291cmNlLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUpIHsKLQkJX2ZpbmlzaGluZysrOwotCi0JfQotCi0JcHVibGljIGludCBnZXRTdGFydGluZygpIHsKLQkJcmV0dXJuIF9zdGFydGluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZpbmlzaGluZygpIHsKLQkJcmV0dXJuIF9maW5pc2hpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCV9zdGFydGluZyA9IDA7Ci0JCV9maW5pc2hpbmcgPSAwOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QyQS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDJBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTlhNDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDJBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIEEgVjEgdmFsaWRhdG9yIHRoYXQgaXMgb2ZmIGJ5IGRlZmF1bHQuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVDJBIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKHVyaXMgIT0gbnVsbClUcmFjaW5nLmxvZygiVDJBLTAxOiBudW1iZXIgb2YgdXJzID0gIiArIHVyaXMubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QyQUhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDJBSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZDQ0ZjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDJBSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBUMkFIZWxwZXIgZXh0ZW5kcyBXb3JrYmVuY2hDb250ZXh0IHsKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRVUklzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCWxvZ2l0KCJUMkFIZWxwZXIjbG9hZE1vZHVsZTogIiArIHN5bWJvbGljTmFtZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm1zKSB7Ci0JCWxvZ2l0KCJUMkFIZWxwZXIjbG9hZE1vZHVsZTI6ICIgKyBzeW1ib2xpY05hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ2l0KFN0cmluZyBsaW5lKXsKLQkJVHJhY2luZy5sb2cobGluZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UMkIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QyQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDRiNDdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1QyQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBBIFYxIHZhbGlkYXRvciB0aGF0IGlzIG9uIGJ5IGRlZmF1bHQuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVDJCIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKHVyaXMgIT0gbnVsbClUcmFjaW5nLmxvZygiVDJCLTAxOiBudW1iZXIgb2YgVVJJcyA9ICIgKyB1cmlzLmxlbmd0aCk7CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Q0QS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDhkNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLQotLyoqCi0gKiBUaGlzIHZhbGlkYXRvciBpcyB1c2VkIHRvIHRlc3QgZmFjZXQgdmVyc2lvbnMuIEl0IHNob3VsZCBiZSBjYWxsZWQgb24gcHJvamVjdHMgdGhhdCBoYXZlIGEgdmVyc2lvbiA1IGphdmEgZmFjZXQuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVDRBIGV4dGVuZHMgVGVzdFZhbGlkYXRvciB7Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlQ0QSI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkKCl7Ci0JCXJldHVybiBBY3RpdmF0b3IuUExVR0lOX0lEICsiLlQ0QSI7Ci0JfQotCQkJCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UNEIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Q0Qi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlmN2UxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Q0Qi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci0KLS8qKgotICogVGhpcyB2YWxpZGF0b3IgaXMgdXNlZCB0byB0ZXN0IGZhY2V0IHZlcnNpb25zLiBJdCBzaG91bGQgYmUgY2FsbGVkIG9uIHByb2plY3RzIHRoYXQgaGF2ZSBhIHZlcnNpb24gNiBqYXZhIGZhY2V0LgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFQ0QiBleHRlbmRzIFRlc3RWYWxpZGF0b3IgewotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJUNEIiOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpZCgpewotCQlyZXR1cm4gQWN0aXZhdG9yLlBMVUdJTl9JRCArIi5UNEIiOwotCX0KLQkJCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDVBLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UNUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzZTNmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UNUEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uQWN0aXZhdG9yOwotCi0vKioKLSAqIFRoaXMgdmFsaWRhdG9yIGlzIHVzZWQgdG8gdGVzdCBwYXR0ZXJuIGZpbHRlcnMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVDVBIGV4dGVuZHMgVGVzdFZhbGlkYXRvciB7Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlQ1QSI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkKCl7Ci0JCXJldHVybiBBY3RpdmF0b3IuUExVR0lOX0lEICsiLlQ1QSI7Ci0JfQotCQkJCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UNUIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Q1Qi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTQwMGYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Q1Qi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci0KLS8qKgotICogVGhpcyB2YWxpZGF0b3IgaXMgdXNlZCB0byB0ZXN0IHBhdHRlcm4gZmlsdGVycy4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUNUIgZXh0ZW5kcyBUZXN0VmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiVDVCIjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWQoKXsKLQkJcmV0dXJuIEFjdGl2YXRvci5QTFVHSU5fSUQgKyIuVDVCIjsKLQl9Ci0JCQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Q1Qy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDVDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYTczNWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDVDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLQotLyoqCi0gKiBUaGlzIHZhbGlkYXRvciBpcyB1c2VkIHRvIHRlc3QgcGF0dGVybiBmaWx0ZXJzLiBUaGlzIHZhbGlkYXRvciB3b3VsZCBub3JtYWxseSB2YWxpZGF0ZSAqLnRlc3QxIGZpbGVzLCBidXQgYW4gZXhjbHVzaW9uIHJ1bGUKLSAqIGhhcyBiZWVuIGFkZGVkICh2aWEgdGhlIGV4Y2x1ZGUgZXh0ZW5zaW9uIHBvaW50KSB0byBub3QgdmFsaWRhdGUgL3NlY29uZC90aGlyZC8gZmlsZXMuIAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFQ1QyBleHRlbmRzIFRlc3RWYWxpZGF0b3IgewotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICJUNUMiOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpZCgpewotCQlyZXR1cm4gQWN0aXZhdG9yLlBMVUdJTl9JRCArIi5UNUMiOwotCX0KLQkJCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDZBLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UNkEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmZjAzNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UNkEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLQotLyoqCi0gKiBUaGlzIHZhbGlkYXRvciBpcyB1c2VkIHRvIHRlc3QgdGhlIG5ldyB2YWxpZGF0ZSBlbnRyeSBwb2ludCB0aGF0IGluY2x1ZGVzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUNkEgZXh0ZW5kcyBUZXN0VmFsaWRhdG9yIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBBdG9taWNJbnRlZ2VyIF9jb3VudFNpbXBsZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciBfY291bnRDb21wbGV4ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDb3VudGVycygpewotCQlfY291bnRTaW1wbGUuc2V0KDApOwotCQlfY291bnRDb21wbGV4LnNldCgwKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q291bnRTaW1wbGUoKXsKLQkJcmV0dXJuIF9jb3VudFNpbXBsZS5nZXQoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Q291bnRDb21wbGV4KCl7Ci0JCXJldHVybiBfY291bnRDb21wbGV4LmdldCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiVDZBIjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWQoKXsKLQkJcmV0dXJuIEFjdGl2YXRvci5QTFVHSU5fSUQgKyIuVDZBIjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJX2NvdW50U2ltcGxlLmluY3JlbWVudEFuZEdldCgpOwotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocmVzb3VyY2UsIGtpbmQsIHN0YXRlLCBtb25pdG9yKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoVmFsaWRhdGlvbkV2ZW50IGV2ZW50LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlfY291bnRDb21wbGV4LmluY3JlbWVudEFuZEdldCgpOwotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUoZXZlbnQuZ2V0UmVzb3VyY2UoKSwgZXZlbnQuZ2V0S2luZCgpLCBzdGF0ZSwgbW9uaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVDdBLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UN0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyMzZjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UN0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLQotLyoqCi0gKiBBIHZhbGlkYXRvciB0aGF0IHRlc3RzIHRoZSBvcmRlciBvZiB0aGUgdmFsaWRhdGUgY2FsbHMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVDdBIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIExpc3Q8VmFsRW50cnlQb2ludD4gX2xpc3QgPSBuZXcgTGlua2VkTGlzdDxWYWxFbnRyeVBvaW50PigpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldExpc3QoKXsKLQkJX2xpc3QuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0PFZhbEVudHJ5UG9pbnQ+IGdldExpc3QoKXsKLQkJcmV0dXJuIF9saXN0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZhbEVudHJ5UG9pbnRbXSBnZXRBcnJheSgpewotCQlWYWxFbnRyeVBvaW50W10gYXJyYXkgPSBuZXcgVmFsRW50cnlQb2ludFtfbGlzdC5zaXplKCldOwotCQlfbGlzdC50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLAlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJX2xpc3QuYWRkKG5ldyBWYWxFbnRyeVBvaW50KEVudHJ5VHlwZS5TdGFydGluZywgcHJvamVjdCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCV9saXN0LmFkZChuZXcgVmFsRW50cnlQb2ludChFbnRyeVR5cGUuRmluaXNoaW5nLCBwcm9qZWN0KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCV9saXN0LmFkZChuZXcgVmFsRW50cnlQb2ludChFbnRyeVR5cGUuTm9ybWFsLCByZXNvdXJjZSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2xlYW4oSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJX2xpc3QuYWRkKG5ldyBWYWxFbnRyeVBvaW50KEVudHJ5VHlwZS5DbGVhbiwgcHJvamVjdCkpOwotCX0KLQkKLQkvKioKLQkgKiBBbiBpbW11dGlibGUgb2JqZWN0IHRoYXQgcmVjb3JkcyBhbiBlbnRyeSBpbnRvIHRoZSB2YWxpZGF0b3IuCi0JICogQGF1dGhvciBrYXJhc2l1awotCSAqCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBWYWxFbnRyeVBvaW50IHsKLQkJcHJpdmF0ZSBmaW5hbCBFbnRyeVR5cGUgCV90eXBlOwotCQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZSAJX3Jlc291cmNlOwotCQkKLQkJcHVibGljIFZhbEVudHJ5UG9pbnQoRW50cnlUeXBlIHR5cGUsIElSZXNvdXJjZSByZXNvdXJjZSl7Ci0JCQlfdHlwZSA9IHR5cGU7Ci0JCQlfcmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2UgPSBfcmVzb3VyY2UgPT0gbnVsbCA/ICJudWxsIiA6IF9yZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gIlZhbEVudHJ5UG9pbnQ6ICIgKyBfdHlwZSArICIgIiArIHJlc291cmNlOwotCQl9Ci0JCQotCQlwdWJsaWMgRW50cnlUeXBlIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gX3R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQkJcmV0dXJuIF9yZXNvdXJjZTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBlbnVtIEVudHJ5VHlwZSB7U3RhcnRpbmcsIE5vcm1hbCwgRmluaXNoaW5nLCBDbGVhbn0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVGVzdFZhbGlkYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVGVzdFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjcwMWI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRvck1lc3NhZ2U7Ci0KLS8qKgotICogU2ltcGxlIHRlc3QgdmFsaWRhdG9yLiAKLSAqIDxwPgotICogVGhpcyB2YWxpZGF0b3IgcHJvY2Vzc2VzIGEgZmlsZSBsb29raW5nIGZvciBjZXJ0YWluIG1hZ2ljIHRva2VuczoKLSAqIDx1bD4KLSAqIDxsaT5pbmNsdWRlIGZpbGVOYW1lIC0gb3BlbiB0aGUgZmlsZSB3aXRoIG5hbWUgZmlsZU5hbWUgYW5kIHByb2Nlc3MgaXQgYXMgYW4gaW5jbHVkZQotICogPGxpPmVycm9yIC0gY3JlYXRlIGFuIGVycm9yIG1hcmtlciBmb3IgdGhpcyBsaW5lCi0gKiA8bGk+d2FybmluZyAtIGNyZWF0ZSBhIHdhcm5pbmcgbWFya2VyIGZvciB0aGlzIGxpbmUKLSAqIDxsaT5pbmZvIC0gY3JlYXRlIGFuIGluZm8gbWFya2VyIGZvciB0aGlzIGxpbmUKLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIEluY2x1ZGUgZmlsZXMgY29udGFpbiB0aGUgbWFnaWMgdG9rZW4gbWFwLiBGb3IgZXhhbXBsZSB0aGUgbGluZSAibWFwIHQxZXJyb3IgZXJyb3IiIHdpbGwKLSAqIGNhdXNlIG9jY3VycmVuY2VzIG9mIHQxZXJyb3IgdG8gYmUgbWFwcGVkIHRvIGVycm9yLgotICogPC9wPgotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNpbXBsZU5hbWUgPSAiVGVzdDEiOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkKCl7Ci0JCXJldHVybiBBY3RpdmF0b3IuUExVR0lOX0lEICsiLiIgKyBTaW1wbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCVZhbGlkYXRpb25SZXN1bHQgdnIgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCWluID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCUJ1ZmZlcmVkUmVhZGVyIHJkciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCQlwcm9jZXNzKHZyLCByZHIsIHJlc291cmNlLCBzdGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCUFjdGl2YXRvci5nZXREZWZhdWx0KCkuaGFuZGxlRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJTWlzYy5jbG9zZShpbik7Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIHZyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCXJldHVybiBpZCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2VzcyhWYWxpZGF0aW9uUmVzdWx0IHZyLCBCdWZmZXJlZFJlYWRlciByZHIsIElSZXNvdXJjZSByZXNvdXJjZSwgVmFsaWRhdGlvblN0YXRlIHN0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCWludCBjb3VudCA9IDA7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbnVsbDsKLQkJd2hpbGUgKG51bGwgIT0gKGxpbmUgPSByZHIucmVhZExpbmUoKSkpewotCQkJY291bnQrKzsKLQkJCWludCBzZXZlcml0eSA9IC0xOwotCQkJU3RyaW5nW10gdG9rZW5zID0gbGluZS5zcGxpdCgiXFxzIik7Ci0JCQlpZiAodG9rZW5zLmxlbmd0aCA9PSAwKWNvbnRpbnVlOwotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zWzBdOwotCQkJc2V2ZXJpdHkgPSBmaW5kU2V2ZXJpdHkodG9rZW4sIHNldmVyaXR5KTsKLQkJCWlmIChzZXZlcml0eSA9PSAtMSAmJiBtYXAgIT0gbnVsbCl7Ci0JCQkJU3RyaW5nIHJlbmFtZWQgPSBtYXAuZ2V0KHRva2VuKTsKLQkJCQlzZXZlcml0eSA9IGZpbmRTZXZlcml0eShyZW5hbWVkLCBzZXZlcml0eSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChzZXZlcml0eSAhPSAtMSl7Ci0JCQkJVmFsaWRhdG9yTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdG9yTWVzc2FnZS5jcmVhdGUobGluZSArICIoYnkgIiArIGdldE5hbWUoKSArIikiLCByZXNvdXJjZSk7Ci0JCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgY291bnQpOwotCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIHNldmVyaXR5KTsKLQkJCQl2ci5hZGQobWVzc2FnZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0b2tlbi5lcXVhbHMoImluY2x1ZGUiKSl7Ci0JCQkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDEwKTsKLQkJCQlTdHJpbmcgbXNnID0gcHJvY2Vzc0luY2x1ZGUodnIsIHRva2VucywgcmVzb3VyY2UsIG1hcCk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKXsKLQkJCQkJVmFsaWRhdG9yTWVzc2FnZSBtZXNzYWdlID0gVmFsaWRhdG9yTWVzc2FnZS5jcmVhdGUobXNnLCByZXNvdXJjZSk7Ci0JCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIGNvdW50KTsKLQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCQkJCXZyLmFkZChtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgaW50IGZpbmRTZXZlcml0eShTdHJpbmcgdG9rZW4sIGludCBkZnQpewotCQlpZiAodG9rZW4gPT0gbnVsbClyZXR1cm4gZGZ0OwotCQlpZiAodG9rZW4uZXF1YWxzKCJlcnJvciIpKXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwotCQlpZiAodG9rZW4uZXF1YWxzKCJ3YXJuaW5nIikpcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJaWYgKHRva2VuLmVxdWFscygiaW5mbyIpKXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCXJldHVybiBkZnQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0luY2x1ZGUoVmFsaWRhdGlvblJlc3VsdCB2ciwgU3RyaW5nW10gdG9rZW5zLCBJUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb257Ci0JCUlDb250YWluZXIgcGFyZW50ID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCUlGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZShuZXcgUGF0aCh0b2tlbnNbMV0pKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKXJldHVybiAiQ291bGQgbm90IGZpbmQgZmlsZTogIiArIGZpbGU7Ci0JCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJkciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJCXdoaWxlKG51bGwgIT0gKGxpbmUgPSByZHIucmVhZExpbmUoKSkpewotCQkJCVN0cmluZ1tdIHAgPSBsaW5lLnNwbGl0KCJcXHMiKTsKLQkJCQlpZiAocC5sZW5ndGggPT0gMyAmJiAibWFwIi5lcXVhbHMocFswXSkpewotCQkJCQltYXAucHV0KHBbMV0sIHBbMl0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCU1pc2MuY2xvc2UoaW4pOwotCQl9Ci0JCUlSZXNvdXJjZVtdIGRlcGVuZHMgPSB7ZmlsZX07Ci0JCXZyLnNldERlcGVuZHNPbihkZXBlbmRzKTsKLQkJcmV0dXJuIG51bGw7Ci0JCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpewotCQlyZXR1cm4gIlRlc3RWYWxpZGF0b3IxIjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVGVzdFZhbGlkYXRvcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3ZjdlMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uTWVzc2FnZVNldmVyaXR5U2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLk1lc3NhZ2VTZXZlcml0eVNldHRpbmcuU2V2ZXJpdHk7Ci0KLS8qKgotICogQSBzaW1wbGUgdGVzdCB2YWxpZGF0b3IgdGhhdCBhbHdheXMgcmV0dXJucyBhbiBlcnJvciBtYXJrZXIgYW5kIGEgd2FybmluZyBtYXJrZXIuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcjIgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIlRlc3RWYWxpZGF0b3IyIjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWQoKXsKLQkJcmV0dXJuIEFjdGl2YXRvci5QTFVHSU5fSUQgKyIuVGVzdDIiOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewotCQlWYWxpZGF0aW9uUmVzdWx0IHZyID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJVmFsaWRhdG9yTWVzc2FnZSB2bSA9IFZhbGlkYXRvck1lc3NhZ2UuY3JlYXRlKCJBIHNhbXBsZSBtZXNzYWdlIGZyb20gIiArIGdldE5hbWUoKSwgcmVzb3VyY2UpOwotCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgMSk7Ci0JCXZtLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJdnIuYWRkKHZtKTsKLQotCQlNZXNzYWdlU2V2ZXJpdHlTZXR0aW5nIHNldiA9IGdldFBhcmVudCgpLmdldE1lc3NhZ2UoInNvcnRvZiIpOwotCQlpZiAoc2V2ICE9IG51bGwpewotCQkJU2V2ZXJpdHkgbXMgPSBzZXYuZ2V0Q3VycmVudCgpOwotCQkJaWYgKG1zICE9IFNldmVyaXR5Lklnbm9yZSl7Ci0JCQkJdm0gPSBWYWxpZGF0b3JNZXNzYWdlLmNyZWF0ZSgiQSBkaWZmZXJlbnQgbWVzc2FnZSBmcm9tICIgKyBnZXROYW1lKCksIHJlc291cmNlKTsKLQkJCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgMik7Ci0JCQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIG1zLmdldE1hcmtlclNldmVyaXR5KCkpOwotCQkJCXZyLmFkZCh2bSk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIHZyOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3IzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE5MjQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3IzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uQWJzdHJhY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UcmFjaW5nOwotCi0vKioKLSAqIEEgdmFsaWRhdG9yIHRoYXQgcHJvY2Vzc2VzICouaHRtbCBhbmQgKi5odG0gZmlsZXMuIAotICogQGF1dGhvciBrYXJhc2l1awotICoKLSAqLwotcHVibGljIGNsYXNzIFRlc3RWYWxpZGF0b3IzIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOYW1lID0gIlRlc3RWYWxpZGF0b3IzIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzLlRlc3RWYWxpZGF0b3IzIjsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOYW1lOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCVRyYWNpbmcubG9nKE5hbWUrIi0wNDogdmFsaWRhdGluZzogIiArIHJlc291cmNlKTsKLQkJY2hlY2tTdGF0ZShzdGF0ZSk7Ci0JCQotCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygidGVzdC5odG1sIikpewotCQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCQlWYWxpZGF0b3JNZXNzYWdlIHZtID0gVmFsaWRhdG9yTWVzc2FnZS5jcmVhdGUoIkEgc3BlY2lmaWMgdGVzdC5odG1sIGVycm9yIiwgcmVzb3VyY2UpOwotCQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIDEpOwotCQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQkJdnIuYWRkKHZtKTsKLQkJCQotCQkJSVJlc291cmNlIG90aGVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCkuZmluZE1lbWJlcigidGVzdDIuaHRtbCIpOwotCQkJaWYgKG90aGVyICE9IG51bGwpdnIuc2V0VmFsaWRhdGVkKG5ldyBJUmVzb3VyY2VbXXtvdGhlcn0pOwotCQkJCi0JCQlJUmVzb3VyY2UgZGVwZW5kcyA9IHJlc291cmNlLmdldFBhcmVudCgpLmZpbmRNZW1iZXIoIm1hc3Rlci5odG1sIik7Ci0JCQlpZiAoZGVwZW5kcyAhPSBudWxsKXZyLnNldERlcGVuZHNPbihuZXcgSVJlc291cmNlW117ZGVwZW5kc30pOwotCQkJcmV0dXJuIHZyOwotCQl9Ci0KLQkJVmFsaWRhdGlvblJlc3VsdCB2ciA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCVZhbGlkYXRvck1lc3NhZ2Ugdm0gPSBWYWxpZGF0b3JNZXNzYWdlLmNyZWF0ZSgiQSBzYW1wbGUgbWVzc2FnZSBmcm9tICIgKyBnZXROYW1lKCksIHJlc291cmNlKTsKLQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIDEpOwotCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCXZyLmFkZCh2bSk7Ci0KLQkJdm0gPSBWYWxpZGF0b3JNZXNzYWdlLmNyZWF0ZSgiQSBkaWZmZXJlbnQgbWVzc2FnZSBmcm9tICIgKyBnZXROYW1lKCksIHJlc291cmNlKTsKLQkJdm0uc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIDMpOwotCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLQkJdnIuYWRkKHZtKTsKLQkJCQkKLQkJcmV0dXJuIHZyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3RyaW5nIG5hbWUgPSBwcm9qZWN0ID09IG51bGwgPyAiTlVMTCIgOiBwcm9qZWN0LmdldE5hbWUoKTsKLQkJVHJhY2luZy5sb2coTmFtZSsiLTA1OiB0aGlua3MgdmFsaWRhdGlvbiBpcyBzdGFydGluZyBmb3IgcHJvamVjdDogIiwgbmFtZSk7Ci0JCWlmICghY2hlY2tTdGF0ZShzdGF0ZSkpewotCQkJc3RhdGUucHV0KElELCAibXkgc3RhdGUiKTsKLQkJfQotCQkKLQkJCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRpb25GaW5pc2hpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3RyaW5nIG5hbWUgPSBwcm9qZWN0ID09IG51bGwgPyAiTlVMTCIgOiBwcm9qZWN0LmdldE5hbWUoKTsKLQkJVHJhY2luZy5sb2coTmFtZSsiLTAxOiB0aGlua3MgdmFsaWRhdGlvbiBpcyBmaW5pc2hpbmcgZm9yIHByb2plY3Q6ICIsIG5hbWUpOwotCQljaGVja1N0YXRlKHN0YXRlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2xlYW4oSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3RyaW5nIG5hbWUgPSBwcm9qZWN0ID09IG51bGwgPyAiTlVMTCIgOiBwcm9qZWN0LmdldE5hbWUoKTsKLQkJVHJhY2luZy5sb2coTmFtZSsiLTAyOiB0aGlua3MgYSBjbGVhbiBoYXMgYmVlbiByZXF1ZXN0ZWQgZm9yIHByb2plY3Q6ICIsIG5hbWUpOwotCQljaGVja1N0YXRlKHN0YXRlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrU3RhdGUoVmFsaWRhdGlvblN0YXRlIHN0YXRlKXsKLQkJaWYgKHN0YXRlLmdldChJRCkgIT0gbnVsbCl7Ci0JCQlUcmFjaW5nLmxvZyhOYW1lKyItMDM6IGhhcyBzdGF0ZSBpbmZvcm1hdGlvbiIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVGVzdFZhbGlkYXRvcjQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTZmZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVGVzdFZhbGlkYXRvcjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLQotLyoqCi0gKiBBIHNsb3dlciB2YWxpZGF0b3IuIFRoaXMgdmFsaWRhdG9yIHRha2VzIGF0IGxlYXN0IDIgc2Vjb25kcyB0byBydW4uCi0gKiAKLSAqIEl0IGxvb2tzIGF0IGZpbGVzIHdpdGggYSBmaWxlIGV4dGVuc2lvbiBvZiB0ZXN0NC4KLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yNCBleHRlbmRzIFRlc3RWYWxpZGF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIFZhbENvdW50ZXJzIF9jb3VudGVycyA9IG5ldyBWYWxDb3VudGVycygpOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkKCl7Ci0JCXJldHVybiBBY3RpdmF0b3IuUExVR0lOX0lEICsiLlRlc3Q0IjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxDb3VudGVycyBnZXRDb3VudGVycygpIHsKLQkJcmV0dXJuIF9jb3VudGVyczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClfY291bnRlcnMuc3RhcnRpbmdDb3VudCsrOwotCQllbHNlIF9jb3VudGVycy5zdGFydGluZ1Byb2plY3RDb3VudCsrOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpX2NvdW50ZXJzLmZpbmlzaGVkQ291bnQrKzsKLQkJZWxzZSBfY291bnRlcnMuZmluaXNoZWRQcm9qZWN0Q291bnQrKzsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVZhbGlkYXRpb25SZXN1bHQgdnIgPSBzdXBlci52YWxpZGF0ZShyZXNvdXJjZSwga2luZCwgc3RhdGUsIG1vbml0b3IpOwotCQlsb25nIGogPSAwOwotCQl0cnkgewotCQkJZm9yIChsb25nIGk9MDsgaTwgMTAwMDAwMDA7IGkrKylqID0gaSArIDE7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpewotCQkJLy8gZWF0IGl0Ci0JCX0KLQkJaisrOyAvLyBqdXN0IHRvIGdldCByaWQgb2YgdGhlIGNvbXBpbGVyIHdhcm5pbmcKLQkJcmV0dXJuIHZyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I1LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU3YzVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi0vKioKLSAqIFRoaXMgdmFsaWRhdG9yIG5ldmVyIGdldHMgY2FsbGVkLCBpdCBqdXN0IHNlcnZlcyBhcyBhIGRlZmluaXRpb24gZm9yIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcjUgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlc291cmNlIHJlc291cmNlLCBpbnQga2luZCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yNUQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I1RC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTc3ZDA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I1RC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZGVsZWdhdGluZyB2YWxpZGF0b3IuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcjVEIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIGludCBfY2FsbGVkQ291bnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgVmFsQ291bnRlcnMgX2NvdW50ZXJzID0gbmV3IFZhbENvdW50ZXJzKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxDb3VudGVycyBnZXRDb3VudGVycygpIHsKLQkJcmV0dXJuIF9jb3VudGVyczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uU3RhcnRpbmcoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvblN0YXRlIHN0YXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbClfY291bnRlcnMuc3RhcnRpbmdDb3VudCsrOwotCQllbHNlIF9jb3VudGVycy5zdGFydGluZ1Byb2plY3RDb3VudCsrOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0aW9uRmluaXNoaW5nKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpX2NvdW50ZXJzLmZpbmlzaGVkQ291bnQrKzsKLQkJZWxzZSBfY291bnRlcnMuZmluaXNoZWRQcm9qZWN0Q291bnQrKzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiVGVzdFZhbGlkYXRvcjVEIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0aW9uUmVzdWx0IHZyID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJX2NhbGxlZENvdW50Kys7Ci0JCXJldHVybiB2cjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRDYWxsZWRDb3VudCgpIHsKLQkJcmV0dXJuIF9jYWxsZWRDb3VudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I2LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdhYjQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi0vKioKLSAqIEEgdmFsaWRhdG9yIHRoYXQgaGFzIHNpbWlsYXIgcnVsZXMgYXMgdGhlIFhNTCB2YWxpZGF0b3IuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFZhbGlkYXRvcjYgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWQoKXsKLQkJcmV0dXJuIEFjdGl2YXRvci5QTFVHSU5fSUQgKyIuVGVzdDYiOwotCX0KLQotCQotCXByaXZhdGUgU2V0PElSZXNvdXJjZT4gX3NldCA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oMTAwKTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCV9zZXQuYWRkKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU2V0PElSZXNvdXJjZT4gZ2V0U2V0KCkgewotCQlyZXR1cm4gX3NldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I3LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWFkZTlmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24uQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotCi0vKioKLSAqIEEgdmFsaWRhdG9yIHRoYXQgaGFzIHNpbWlsYXIgcnVsZXMgYXMgdGhlIFRlc3QxIFZhbGlkYXRvciwgdXNlZCB0byB0ZXN0IHRoZSBzdXNwZW5kIHZhbGlkYXRpb24gQVBJLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yNyBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpZCgpewotCQlyZXR1cm4gQWN0aXZhdG9yLlBMVUdJTl9JRCArIi5UZXN0NyI7Ci0JfQotCQotCXByaXZhdGUgU2V0PElSZXNvdXJjZT4gX3NldCA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oMTAwKTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCV9zZXQuYWRkKHJlc291cmNlKTsKLQkJcmVzdWx0LnNldFN1c3BlbmRWYWxpZGF0aW9uKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFNldDxJUmVzb3VyY2U+IGdldFNldCgpIHsKLQkJcmV0dXJuIF9zZXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCl7Ci0JCV9zZXQuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I4LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9UZXN0VmFsaWRhdG9yOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTliNjEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMudmFsaWRhdGlvbi92YWxpZGF0b3JzL29yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL3Rlc3RzL1Rlc3RWYWxpZGF0b3I4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3JNZXNzYWdlOwotCi0vKioKLSAqIEEgc2ltcGxlIHRlc3QgdmFsaWRhdG9yIHRoYXQgYWx3YXlzIHJldHVybnMgYW4gZXJyb3IgbWFya2VyIG9uIGxpbmUgMS4gVGhpcyBjYW4gYmUgZXh0ZW5kZWQgYnkgb3RoZXIgdGVzdGNhc2VzLgotICogCi0gKiBUZXN0OCBpcyB1c2VkIHRvIHRlc3QgdGhlIGZpbGUgZmlsdGVyLiBUaGUgYm90aCBmaWxlcyBuYW1lZCBmaWxlLnNwZWNpZmljIHNob3VsZCBiZSB2YWxpZGF0ZWQsIHdoZXJlIGFzIG9ubHkgCi0gKiBzb3VyY2UvZnVsbC5zcGVjaWZpYyBzaG91bGQgYmUgdmFsaWRhdGVkLiAKLSAqIEBhdXRob3Iga2FyYXNpdWsKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0VmFsaWRhdG9yOCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiVGVzdFZhbGlkYXRvcjgiOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpZCgpewotCQlyZXR1cm4gQWN0aXZhdG9yLlBMVUdJTl9JRCArIi5UZXN0OCI7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCVZhbGlkYXRpb25SZXN1bHQgdnIgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlWYWxpZGF0b3JNZXNzYWdlIHZtID0gVmFsaWRhdG9yTWVzc2FnZS5jcmVhdGUoIkEgc2FtcGxlIGVycm9yIGZyb20gIiArIGdldE5hbWUoKSwgcmVzb3VyY2UpOwotCQl2bS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgMSk7Ci0JCXZtLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJdnIuYWRkKHZtKTsJCQkJCi0JCXJldHVybiB2cjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9WYWxDb3VudGVycy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy52YWxpZGF0aW9uL3ZhbGlkYXRvcnMvb3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vdGVzdHMvVmFsQ291bnRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwZmM0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnZhbGlkYXRpb24vdmFsaWRhdG9ycy9vcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi90ZXN0cy9WYWxDb3VudGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi50ZXN0czsKLQotLyoqCi0gKiBTb21lIG1pc2NlbGxhbmVvdXMgY291bnRlcnMuCi0gKiBAYXV0aG9yIGthcmFzaXVrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsQ291bnRlcnMgewotCXB1YmxpYyBpbnQgCXN0YXJ0aW5nQ291bnQ7Ci0JcHVibGljIGludAlmaW5pc2hlZENvdW50OwotCXB1YmxpYyBpbnQgCXN0YXJ0aW5nUHJvamVjdENvdW50OwotCXB1YmxpYyBpbnQJZmluaXNoZWRQcm9qZWN0Q291bnQ7Ci0JCi0JcHVibGljIHZvaWQgcmVzZXQoKXsKLQkJc3RhcnRpbmdDb3VudCA9IDA7Ci0JCXN0YXJ0aW5nUHJvamVjdENvdW50ID0gMDsKLQkJZmluaXNoZWRDb3VudCA9IDA7Ci0JCWZpbmlzaGVkUHJvamVjdENvdW50ID0gMDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJWYWxDb3VudGVyczogc3RhcnRpbmdDb3VudD0iICsgc3RhcnRpbmdDb3VudCArICIsIGZpbmlzaGVkQ291bnQ9IitmaW5pc2hlZENvdW50KwotCQkJIiwgc3RhcnRQcm9qZWN0Q291bnQ9IitzdGFydGluZ1Byb2plY3RDb3VudCsiLCBmaW5pc2hlZFByb2plY3RDb3VudD0iK2ZpbmlzaGVkUHJvamVjdENvdW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3OTNkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbnRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3JrdGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJhcGl0b29scyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZhYzI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1jb21tb250ZXN0cy5qYXIKLWphdmFDb21waWxlci5jb21tb250ZXN0cy5qYXIuYXJncwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjA5NTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMGEzYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6Mzg6MzEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOWJkYmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMjAwLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogY29tbW9udGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLAotIG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdHMueG1sLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5leHRyYXMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFydGlmYWN0ZWRpdC50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnRlc3RzLmJ2dCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjIsNC4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3I7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iMS4yLjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotUGx1Z2luLUNsYXNzOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hcGl0b29scy9vcmcvZWNsaXBzZS9ldG9vbHMvY29tbW9uL3Rlc3QvYXBpdG9vbHMvUHJvamVjdFVuemlwVXRpbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9hcGl0b29scy9vcmcvZWNsaXBzZS9ldG9vbHMvY29tbW9uL3Rlc3QvYXBpdG9vbHMvUHJvamVjdFVuemlwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzY3ZDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYXBpdG9vbHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0L2FwaXRvb2xzL1Byb2plY3RVbnppcFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdC5hcGl0b29sczsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlByb2plY3REZXNjcmlwdGlvblJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotcHVibGljIGNsYXNzIFByb2plY3RVbnppcFV0aWwgewotCi0JcHJpdmF0ZSBJUGF0aCB6aXBMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZ1tdIHByb2plY3ROYW1lczsKLQlwcml2YXRlIElQYXRoIHJvb3RMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9QUk9KRUNUX05BTUUgPSAiLnByb2plY3QiOwotCi0KLQotCXB1YmxpYyBQcm9qZWN0VW56aXBVdGlsKElQYXRoIGFaaXBMb2NhdGlvbiwgU3RyaW5nW10gYVByb2plY3ROYW1lcykgewotCQl6aXBMb2NhdGlvbiA9IGFaaXBMb2NhdGlvbjsKLQkJcHJvamVjdE5hbWVzID0gYVByb2plY3ROYW1lczsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVByb2plY3RzKCkgewotCQl0cnkgewotCQkJZXhwYW5kWmlwKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQkJYnVpbGRQcm9qZWN0cygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9nZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFppcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGdldFByb2dlc3NNb25pdG9yKCk7Ci0JCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl6aXBGaWxlID0gbmV3IFppcEZpbGUoemlwTG9jYXRpb24udG9GaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJdGhyb3cgZTE7Ci0JCX0KLQkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcEZpbGUuZW50cmllcygpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJWmlwRW50cnkgZW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCW1vbml0b3Iuc3ViVGFzayhlbnRyeS5nZXROYW1lKCkpOwotCQkJRmlsZSBhRmlsZSA9IGNvbXB1dGVMb2NhdGlvbihlbnRyeS5nZXROYW1lKCkpLnRvRmlsZSgpOwotCQkJRmlsZSBwYXJlbnRGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJYUZpbGUubWtkaXJzKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFyZW50RmlsZSA9IGFGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJaWYgKCFwYXJlbnRGaWxlLmV4aXN0cygpKQotCQkJCQkJcGFyZW50RmlsZS5ta2RpcnMoKTsKLQkJCQkJaWYgKCFhRmlsZS5leGlzdHMoKSkKLQkJCQkJCWFGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJY29weSh6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0oYUZpbGUpKTsKLQkJCQkJaWYgKGVudHJ5LmdldFRpbWUoKSA+IDApCi0JCQkJCQlhRmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBjb21wdXRlTG9jYXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHJvb3RMb2NhdGlvbi5hcHBlbmQobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotCQl0cnkgewotCQkJaW50IG4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChidWZmZXIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdExvY2F0aW9uKElQYXRoIHJvb3RMb2NhdGlvbikgewotCQl0aGlzLnJvb3RMb2NhdGlvbiA9IHJvb3RMb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9qZWN0RGVzY3JpcHRpb25SZWFkZXIgcGQgPSBuZXcgUHJvamVjdERlc2NyaXB0aW9uUmVhZGVyKCk7Ci0JCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKCIvIiArIHByb2plY3ROYW1lc1tpXSArICIvIiArIE1FVEFfUFJPSkVDVF9OQU1FKTsKLQkJCUlQYXRoIHBhdGggPSByb290TG9jYXRpb24uYXBwZW5kKHByb2plY3RQYXRoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWVzW2ldKTsKLQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLQkJCXRyeSB7Ci0JCQkJZGVzY3JpcHRpb24gPSBwZC5yZWFkKHBhdGgpOwotCQkJCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCAoZ2V0UHJvZ2Vzc01vbml0b3IoKSkpOwotCQkJCXByb2plY3Qub3BlbihnZXRQcm9nZXNzTW9uaXRvcigpKTsKLQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IGU7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGUxZTIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGNvbW1vbnRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3REYXRhLyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLmNvbW1vbnRlc3RzLmphciA9IGNvbW1vbnRlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrdGVzdHMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcGl0b29scy8KLW91dHB1dC5jb21tb250ZXN0cy5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNWRlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1DT05UQUNUPWRhbmJlcmdAdXMuaWJtLmNvbQotQ29tcG9uZW50U2hvcnROYW1lPWNvbW1vbnRlc3RzCi1Db21wb25lbnRGdWxsTmFtZT1Db21tb24gVGVzdHMKLUNvbXBvbmVudENvbXBldGVuY3k9Q29tbW9uIFRlc3RzCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1jYWxsIHdlYmJ2dC5iYXQKLUV4cG9ydC5qYXJGaWxlPWNvbW1vbnRlc3RzLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9wYWNrYWdlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTg4YzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiIGRlZmF1bHQ9InBhY2thZ2luZ1BsdWdpbiIgYmFzZWRpcj0iLi8uLiI+Ci0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhY2thZ2VEaXIiIHZhbHVlPSIiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kaXJlY3RvcnkiICB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmlkIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9jb21tb250ZXN0cy5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC93c0J1aWxkLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzBiODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9idWlsZC93c0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHByb2plY3QgWwotCTwhRU5USVRZIGJhc2VCdWlsZCBTWVNURU0gImZpbGU6Li4vLi4vd3NCdWlsZERlZi54bWwiPgotXT4KLQotPHByb2plY3QgbmFtZT0iYnVpbGRQbHVnaW4iIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLy4uIj4KLQotPCEtLSBpbmNsdWRlIHRoZSBjb21tb24geG1sIGJ1aWxkIGZpbGUgLS0+Ci0mYmFzZUJ1aWxkOwotCi08dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIiBpZj0icGx1Z2luLmlkIj4KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSIke2RlZmF1bHRqYXJuYW1lfSIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofSIvPgotCTwvYW50Y2FsbD4KLTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS9ldG9vbHMvY29tbW9uL3Rlc3RzL3htbC9Eb21Db21wYXJpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL2V0b29scy9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ODRkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL2V0b29scy9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdHMueG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIFRIRSBNQVNURVIgQ09QWSBvZiB0aGlzIGNsYXNzIGlzIGluIGNvbS5pYm0uZXRvb2xzLmNvbW1vbnRlc3RzCi0gKiBQbGVhc2UgdXBkYXRlIHRoZSBjb3B5IGluIGNvbW1vbnRlc3RzIGFuZCB0aGVuIGNvcHkgdGhpcyBjbGFzcyB0bwotICogd2hlcmUgeW91IG5lZWQgaXQgaWYgeW91IGFyZSBsb29raW5nIGF0IGEgZGlmZmVyZW50IGNvcHkKLSAqIAotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRG9tQ29tcGFyaXRvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldCBhdHRyaWJ1dGVMaXN0OwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMiwgSGFzaFNldCBpZ25vcmFibGVBdHRzLCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgYXR0cmlidXRlTGlzdCA9IGlnbm9yYWJsZUF0dHM7Ci0vLyAgICAgICAgRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgICAgICBpZiAoZW50aXR5UmVzb2x2ZXIgPT0gbnVsbCkgewotLy8gICAgICAgICAgICBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkgewotLy8gICAgICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0vLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0pOwotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UxKTsKLS8vICAgICAgICBEb2N1bWVudCBkb2MxID0gcGFyc2VyLmdldERvY3VtZW50KCk7Ci0vLyAgICAgICAgcGFyc2VyLnBhcnNlKHNvdXJjZTIpOwotLy8gICAgICAgIERvY3VtZW50IGRvYzIgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKTsKLS8vICAgICAgICByZXR1cm4gY29tcGFyZU5vZGVzKGRvYzEsIGRvYzIpOwotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZURvbXMoSW5wdXRTb3VyY2Ugc291cmNlMSwgSW5wdXRTb3VyY2Ugc291cmNlMiwgSGFzaFNldCBpZ25vcmFibGVBdHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIsIGlnbm9yYWJsZUF0dHMsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY29tcGFyZURvbXMoc291cmNlMSwgc291cmNlMiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZU5vZGVzKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBBOiIgKyBub2RlMSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIEI6IiArIG5vZGUyKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibm9kZVR5cGU9IiArIG5vZGUxLmdldE5vZGVUeXBlKCkpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROb2RlTmFtZT0iICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGVWYWx1ZT0iICsgbm9kZTEuZ2V0Tm9kZVZhbHVlKCkpOwotCi0gICAgICAgIC8vR2VuZXJpYyBOb2RlIFRlc3RpbmcgCi0gICAgICAgIC8vICAgICAgICBpZiAobm9kZTEgPT0gbnVsbCAmJiBub2RlMiA9PSBudWxsKQotICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAvLyAgICAgICAgZWxzZSAKLSAgICAgICAgaWYgKChub2RlMSAhPSBudWxsICYmIG5vZGUyID09IG51bGwpIHx8IG5vZGUxID09IG51bGwgJiYgbm9kZTIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsTm9kZUVuY291bnRlcmVkKG5vZGUxLCBub2RlMik7Ci0gICAgICAgIGVsc2UgaWYgKG5vZGUxLmdldE5vZGVUeXBlKCkgIT0gbm9kZTIuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVUeXBlKCkgIiArIG5vZGUxLmdldE5vZGVUeXBlKCkgKyAiICIgKyBub2RlMi5nZXROb2RlVHlwZSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUxLmdldE5vZGVOYW1lKCkgIT0gbm9kZTIuZ2V0Tm9kZU5hbWUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVOYW1lKCkgPCIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlTmFtZSgpICsgIj4iLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKCEobm9kZTEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCAmJiBub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgaWYgKG5vZGUxLmdldE5vZGVWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgbm9kZSBBIGlzIG51bGwiLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVWYWx1ZSgpIG5vZGUgQiBpcyBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGUxLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMobm9kZTIuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5nZXROb2RlVmFsdWUoKSA8IiArIG5vZGUxLmdldE5vZGVWYWx1ZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlVmFsdWUoKSArICI+Iiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1RPRE8gc3RyZW5ndGhlbiBub2RlIGNvbXBhcmlzb25zIGFzIG5lY2Vzc2FyeQotICAgICAgICAvL1NwZWNpYWxpemVkIE5vZGUgVGVzdGluZwotICAgICAgICBzd2l0Y2ggKG5vZGUxLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTEgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTE7Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTIgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTI7Ci0gICAgICAgICAgICAgICAgaWYgKCFjZGF0YTEuZ2V0RGF0YSgpLnRyaW0oKS5lcXVhbHMoY2RhdGEyLmdldERhdGEoKS50cmltKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQ2hhcmFjdGVyRGF0YS5nZXREYXRhKCkgIiArIGNkYXRhMS5nZXREYXRhKCkgKyAiICIgKyBjZGF0YTIuZ2V0RGF0YSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMSA9IChBdHRyKSBub2RlMTsKLSAgICAgICAgICAgICAgICBBdHRyIGF0dHIyID0gKEF0dHIpIG5vZGUyOwotICAgICAgICAgICAgICAgIGlmICghYXR0cjEuZ2V0TmFtZSgpLmVxdWFscyhhdHRyMi5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXROYW1lKCkgIiArIGF0dHIxLmdldE5hbWUoKSArICIgIiArIGF0dHIyLmdldE5hbWUoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdHRyMS5nZXRWYWx1ZSgpLmVxdWFscyhhdHRyMi5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkF0dHIuZ2V0VmFsdWUoKSAiICsgYXR0cjEuZ2V0VmFsdWUoKSArICIgIiArIGF0dHIyLmdldFZhbHVlKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyMS5nZXRTcGVjaWZpZWQoKSAhPSBhdHRyMi5nZXRTcGVjaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkF0dHIuZ2V0U3BlY2lmaWVkKCkgIiArIGF0dHIxLmdldFNwZWNpZmllZCgpICsgIiAiICsgYXR0cjIuZ2V0U3BlY2lmaWVkKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYzEgPSAoRG9jdW1lbnQpIG5vZGUxOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpIG5vZGUyOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBjb21wYXJlTm9kZXMoZG9jMS5nZXREb2N0eXBlKCksIGRvYzIuZ2V0RG9jdHlwZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLSAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGUgZG9jVHlwZTEgPSAoRG9jdW1lbnRUeXBlKSBub2RlMTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGUgZG9jVHlwZTIgPSAoRG9jdW1lbnRUeXBlKSBub2RlMjsKLSAgICAgICAgICAgICAgICBpZiAoIWRvY1R5cGUxLmdldFB1YmxpY0lkKCkuZXF1YWxzKGRvY1R5cGUyLmdldFB1YmxpY0lkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiRG9jdW1lbnRUeXBlLmdldFB1YmxpY0lkKCkgIiArIGRvY1R5cGUxLmdldFB1YmxpY0lkKCkgKyAiICIgKyBkb2NUeXBlMi5nZXRQdWJsaWNJZCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwSW5zdDEgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlMTsKLSAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcEluc3QyID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZTI7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmdJbnN0cnVjdGlvbiB0b2RvIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA6Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBmcmFnMSA9IChEb2N1bWVudEZyYWdtZW50KSBub2RlMTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IGZyYWcyID0gKERvY3VtZW50RnJhZ21lbnQpIG5vZGUyOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudEZyYWdtZW50IHRvZG8iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgICAgIGNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vUmVjdXJzaW9uCi0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMSA9IG5vZGUxLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMyID0gbm9kZTIuZ2V0QXR0cmlidXRlcygpOwotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzMSAhPSBudWxsICYmIGF0dHJpYnV0ZXMyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlnbm9yZUF0dHJpYnV0ZXMoYXR0cmlidXRlczEsIGF0dHJpYnV0ZXMyKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSAhPSBhdHRyaWJ1dGVzMi5nZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpICIgKyBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKSArICIgIiArIGF0dHJpYnV0ZXMyLmdldExlbmd0aCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzMS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMSA9IChBdHRyKSBhdHRyaWJ1dGVzMS5pdGVtKGkpOwotICAgICAgICAgICAgICAgIEF0dHIgYXR0cjIgPSAoQXR0cikgYXR0cmlidXRlczIuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhhdHRyMSwgYXR0cjIpOwotCQkJCWlmIChudWxsICE9IHJlc3VsdHMpIHsKLQkJCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCQkJfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlczEgIT0gbnVsbCB8fCBhdHRyaWJ1dGVzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldEF0dHJpYnV0ZXMoKSBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBjaGlsZHJlbjEgPSBnZXRBc0FycmF5TGlzdChub2RlMS5nZXRDaGlsZE5vZGVzKCkpOwotICAgICAgICBBcnJheUxpc3QgY2hpbGRyZW4yID0gZ2V0QXNBcnJheUxpc3Qobm9kZTIuZ2V0Q2hpbGROb2RlcygpKTsKLQotICAgICAgICBpZ25vcmVDb21tZW50cyhjaGlsZHJlbjEpOwotICAgICAgICBpZ25vcmVDb21tZW50cyhjaGlsZHJlbjIpOwotCi0gICAgICAgIGlnbm9yZUVtcHR5VGV4dE5vZGVzKGNoaWxkcmVuMSk7Ci0gICAgICAgIGlnbm9yZUVtcHR5VGV4dE5vZGVzKGNoaWxkcmVuMik7Ci0KLSAgICAgICAgaWYgKGNoaWxkcmVuMS5zaXplKCkgIT0gY2hpbGRyZW4yLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmhhc0NoaWxkTm9kZXMoKSAiICsgY2hpbGRyZW4xLnNpemUoKSArICIgIiArIGNoaWxkcmVuMi5zaXplKCksIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuMS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTm9kZSBjaGlsZDEgPSAoTm9kZSkgY2hpbGRyZW4xLmdldChpKTsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gKE5vZGUpIGNoaWxkcmVuMi5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhjaGlsZDEsIGNoaWxkMik7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGdldEFzQXJyYXlMaXN0KE5vZGVMaXN0IG9yaWdpbmFsTGlzdCkgewotICAgICAgICBBcnJheUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKG9yaWdpbmFsTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yaWdpbmFsTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQob3JpZ2luYWxMaXN0Lml0ZW0oaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaWdub3JlQ29tbWVudHMoQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgQXJyYXlMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICB0b1JlbW92ZS5hZGQobm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbGlzdC5yZW1vdmUodG9SZW1vdmUuZ2V0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaWdub3JlRW1wdHlUZXh0Tm9kZXMoQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgQXJyYXlMaXN0IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCB8fCBub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFkZChub2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0LnJlbW92ZSh0b1JlbW92ZS5nZXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMxCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZ25vcmVBdHRyaWJ1dGVzKE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMSwgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMyKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgU3RyaW5nIGlnbm9yZTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZ25vcmUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMxLmdldE5hbWVkSXRlbShpZ25vcmUpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMxLnJlbW92ZU5hbWVkSXRlbShpZ25vcmUpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzMi5nZXROYW1lZEl0ZW0oaWdub3JlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzMi5yZW1vdmVOYW1lZEl0ZW0oaWdub3JlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG51bGxOb2RlRW5jb3VudGVyZWQoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJOdWxsIG5vZGUgZW5jb3VudGVyZWQiOwotICAgICAgICBOb2RlIG5vbk51bGxOb2RlID0gbm9kZTEgPT0gbnVsbCA/IG5vZGUyIDogbm9kZTE7Ci0gICAgICAgIGNoYXIgc291cmNlID0gbm9kZTEgPT0gbnVsbCA/ICdCJyA6ICdBJzsKLSAgICAgICAgd2hpbGUgKG5vbk51bGxOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gc291cmNlICsgbm9uTnVsbE5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub25OdWxsTm9kZSA9IG5vbk51bGxOb2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub2RlTm90Q29tcGFyZWQoTm9kZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gIk5vZGUgbm9kZSBjb21wYXJlZDoiOwotICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNtYXRjaChTdHJpbmcgbWlzbWF0Y2h0eXBlLCBOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm9kZXMgQSBhbmQgQiBkbyBub3QgbWF0Y2ggYmVjYXVzZSBvZiBub2RlLiIgKyBtaXNtYXRjaHR5cGUgKyAiXG4iOwotICAgICAgICB3aGlsZSAobm9kZTEgIT0gbnVsbCAmJiBub2RlMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9ICJBOiIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gIkI6IiArIG5vZGUyLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbm9kZTEgPSBub2RlMS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBub2RlMiA9IG5vZGUyLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0cy94bWwvRG9tQ29tcGFyaXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2UvZXRvb2xzL2NvbW1vbi90ZXN0cy94bWwvRG9tQ29tcGFyaXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyODA4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL2V0b29scy9jb21tb24vdGVzdHMveG1sL0RvbUNvbXBhcml0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0cy54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21Db21wYXJpdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIFN0cmluZyBiYXNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgU3RyaW5nIHRlc3REYXRhID0gYmFzZURpciArICJ0ZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotICAgIHB1YmxpYyBEb21Db21wYXJpdG9yVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxEb21zXzAxKCkgewotICAgICAgICBjaGVja0VxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAiYmFzZURhdGFfMDEueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVxdWFsRG9tc18wMV8wMSgpIHsKLSAgICAgICAgY2hlY2tFcXVhbCgiYmFzZURhdGFfMDEueG1sIiwgImVxdWFsVG9fMDFfY2FzZV8wMS54bWwiKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxEb21zXzAxXzAyKCkgewotCQljaGVja0VxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAiZXF1YWxUb18wMV9jYXNlXzAyLnhtbCIpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmVxdWFsRG9tXzAxXzAxKCkgewotICAgICAgICBjaGVja1VuZXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJ1bmVxdWFsVG9fMDFfY2FzZV8wMS54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5lcXVhbERvbV8wMV8wMigpIHsKLSAgICAgICAgY2hlY2tVbmVxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAidW5lcXVhbFRvXzAxX2Nhc2VfMDIueG1sIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuZXF1YWxEb21fMDFfMDMoKSB7Ci0gICAgICAgIGNoZWNrVW5lcXVhbCgiYmFzZURhdGFfMDEueG1sIiwgInVuZXF1YWxUb18wMV9jYXNlXzAzLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmVxdWFsRG9tXzAxXzA0KCkgewotICAgICAgICBjaGVja1VuZXF1YWwoImJhc2VEYXRhXzAxLnhtbCIsICJ1bmVxdWFsVG9fMDFfY2FzZV8wNC54bWwiKTsKLSAgICB9Ci0KLSAgICAvL1RPRE8gZmlndXJlIG91dCBob3cgdG8gY29tcGFyZSBlbmNvZGluZ3MKLSAgICAvLwlwdWJsaWMgdm9pZCB0ZXN0VW5lcXVhbERvbV8wMV8wNSgpIHsKLSAgICAvLwkJY2hlY2tVbmVxdWFsKCJiYXNlRGF0YV8wMS54bWwiLCAidW5lcXVhbFRvXzAxX2Nhc2VfMDUueG1sIik7Ci0gICAgLy8JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRXF1YWwoU3RyaW5nIGZpbGVOYW1lMSwgU3RyaW5nIGZpbGVOYW1lMikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlMSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihuZXcgRmlsZSh0ZXN0RGF0YSArIGZpbGVOYW1lMSkpKTsKLSAgICAgICAgICAgIElucHV0U291cmNlIHNvdXJjZTIgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVSZWFkZXIobmV3IEZpbGUodGVzdERhdGEgKyBmaWxlTmFtZTIpKSk7Ci0vLyAgICAgICAgICAgIFN0cmluZyByZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhzb3VyY2UxLCBzb3VyY2UyKTsKLS8vICAgICAgICAgICAgaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkVxdWFsIGRvbXMgY29tcGFyZWQgYXMgdW5lcXVhbCAiICsgZmlsZU5hbWUxICsgIiAiICsgZmlsZU5hbWUyICsgIlxuY29tcGFyZSByZXN1bHRzID0gIiArIHJlc3VsdHMpOwotLy8gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVW5lcXVhbChTdHJpbmcgZmlsZU5hbWUxLCBTdHJpbmcgZmlsZU5hbWUyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UxID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKG5ldyBGaWxlKHRlc3REYXRhICsgZmlsZU5hbWUxKSkpOwotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlMiA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZVJlYWRlcihuZXcgRmlsZSh0ZXN0RGF0YSArIGZpbGVOYW1lMikpKTsKLS8vICAgICAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBEb21Db21wYXJpdG9yLmNvbXBhcmVEb21zKHNvdXJjZTEsIHNvdXJjZTIpOwotLy8gICAgICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiVW5lcXVhbCBkb21zIGNvbXBhcmVkIGFzIGVxdWFsICIgKyBmaWxlTmFtZTEgKyAiICIgKyBmaWxlTmFtZTIpOwotLy8gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZXh0cmFzL01lbW9yeVVzYWdlVGVzdFN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZXh0cmFzL01lbW9yeVVzYWdlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZDdjOTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2V4dHJhcy9NZW1vcnlVc2FnZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5leHRyYXM7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICovCi1wdWJsaWMgY2xhc3MgTWVtb3J5VXNhZ2VUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCS8vcHJvdGVjdGVkIFN0cmluZyBHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FID0gImQ6L2VjbGlwc2UvY29tbW9uX2FyY2hpdmUvbWVtb3J5VXNhZ2UvQ29tbW9uQXJjaGl2ZV9NT0Y1Lm91dCI7Ci0JcHJvdGVjdGVkIFN0cmluZyBHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FID0gIi4vRU1GX0RhdGEudHh0IjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBUUkFDS19NRU1PUlkgPSB0cnVlOwotCXByb3RlY3RlZCBTdHJpbmcgb3V0cHV0RmlsZU5hbWU7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1lbW9yeVVzYWdlVGVzdFN1aXRlLgotCSAqLwotCXB1YmxpYyBNZW1vcnlVc2FnZVRlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1lbW9yeVVzYWdlVGVzdFN1aXRlLgotCSAqIEBwYXJhbSB0aGVDbGFzcwotCSAqLwotCXB1YmxpYyBNZW1vcnlVc2FnZVRlc3RTdWl0ZShDbGFzcyB0aGVDbGFzcykgewotCQlzdXBlcih0aGVDbGFzcyk7Ci0JfQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNZW1vcnlVc2FnZVRlc3RTdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNZW1vcnlVc2FnZVRlc3RTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotLy8JCVRpbWVyU3RlcCBzdGVwID0gbnVsbDsKLS8vCQlpZiAoVFJBQ0tfTUVNT1JZKSB7Ci0vLwkJCXN0ZXAgPSBUaW1lclN0ZXAuaW5zdGFuY2UoKTsKLS8vCQkJc3RlcC5zZXRMb2dGaWxlKGdldE91dHB1dE5hbWUoKSk7Ci0vLwkJCWlmICghc3RlcC5pc09uKCkpCi0vLwkJCQlzdGVwLnNldElzT24odHJ1ZSk7Ci0vLwkJCXN0ZXAud3JpdGUoIiIsICJCZWZvcmUgIiArIGdldE1lbW9yeU5hbWUoKSArICIgVGVzdCBSdW4iKTsKLS8vCQkJc3RlcC50b3RhbE1lbW9yeSgwKTsKLS8vCQkJc3RlcC51c2VkTWVtb3J5KDApOwotLy8JCX0KLS8vCQlzdXBlci5ydW4ocmVzdWx0KTsKLS8vCQlpZiAoVFJBQ0tfTUVNT1JZKSB7Ci0vLwkJCXN0ZXAud3JpdGUoIiIsICJBZnRlciAiICsgZ2V0TWVtb3J5TmFtZSgpICsgIiBUZXN0IFJ1biIpOwotLy8JCQlzdGVwLnRvdGFsTWVtb3J5KDApOwotLy8JCQlzdGVwLnVzZWRNZW1vcnkoMCk7Ci0vLwkJfQotCQkKLQkJc3VwZXIucnVuKHJlc3VsdCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldE91dHB1dE5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRPdXRwdXROYW1lKCkgewotCQlpZiAob3V0cHV0RmlsZU5hbWUgIT0gbnVsbCAmJiBvdXRwdXRGaWxlTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gb3V0cHV0RmlsZU5hbWU7Ci0JCXJldHVybiBHTE9CQUxfT1VUUFVUX0ZJTEVOQU1FOwotCX0KLQotCi0JLyoqCi0JICogTWV0aG9kIGdldE1lbW9yeU5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNZW1vcnlOYW1lKCkgewotCQlpZiAoZ2V0TmFtZSgpICE9IG51bGwgJiYgZ2V0TmFtZSgpLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCWlmIChnZXRDbGFzcygpICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCXJldHVybiAiVW5rbm93biBUZXN0IjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvdXRwdXRGaWxlTmFtZS4KLQkgKiBAcGFyYW0gb3V0cHV0RmlsZU5hbWUgVGhlIG91dHB1dEZpbGVOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dHB1dEZpbGVOYW1lKFN0cmluZyBvdXRwdXRGaWxlTmFtZSkgewotCQl0aGlzLm91dHB1dEZpbGVOYW1lID0gb3V0cHV0RmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ0xPQkFMX09VVFBVVF9GSUxFTkFNRS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R0xPQkFMX09VVFBVVF9GSUxFTkFNRSgpIHsKLQkJcmV0dXJuIEdMT0JBTF9PVVRQVVRfRklMRU5BTUU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ0xPQkFMX09VVFBVVF9GSUxFTkFNRS4KLQkgKiBAcGFyYW0gZ0xPQkFMX09VVFBVVF9GSUxFTkFNRSBUaGUgZmlsZU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0R0xPQkFMX09VVFBVVF9GSUxFTkFNRShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJR0xPQkFMX09VVFBVVF9GSUxFTkFNRSA9IGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRSQUNLX01FTU9SWS4KLQkgKiBAcGFyYW0gdFJBQ0tfTUVNT1JZIFRoZSBhQm9vbGVhbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUUkFDS19NRU1PUlkoYm9vbGVhbiBhQm9vbGVhbikgewotCQlUUkFDS19NRU1PUlkgPSBhQm9vbGVhbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Bc3NlcnRXYXJuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvQXNzZXJ0V2Fybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjdlNzlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Bc3NlcnRXYXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotCi1wdWJsaWMgY2xhc3MgQXNzZXJ0V2FybiBleHRlbmRzIEFzc2VydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxBc3NlcnRpb25GYWlsZWRFcnJvcj4gd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0PEFzc2VydGlvbkZhaWxlZEVycm9yPigpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKGJvb2xlYW4gZXhwZWN0ZWQsIGJvb2xlYW4gYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhieXRlIGV4cGVjdGVkLCBieXRlIGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoY2hhciBleHBlY3RlZCwgY2hhciBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKGRvdWJsZSBleHBlY3RlZCwgZG91YmxlIGFjdHVhbCwgZG91YmxlIGRlbHRhKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsLCBkZWx0YSk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoZmxvYXQgZXhwZWN0ZWQsIGZsb2F0IGFjdHVhbCwgZmxvYXQgZGVsdGEpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwsIGRlbHRhKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMobG9uZyBleHBlY3RlZCwgbG9uZyBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKHNob3J0IGV4cGVjdGVkLCBzaG9ydCBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGV4cGVjdGVkLCBib29sZWFuIGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGJ5dGUgZXhwZWN0ZWQsIGJ5dGUgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgY2hhciBleHBlY3RlZCwgY2hhciBhY3R1YWwpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBkb3VibGUgZXhwZWN0ZWQsIGRvdWJsZSBhY3R1YWwsIGRvdWJsZSBkZWx0YSkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCwgZGVsdGEpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBmbG9hdCBleHBlY3RlZCwgZmxvYXQgYWN0dWFsLCBmbG9hdCBkZWx0YSkgewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCwgZGVsdGEpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBpbnQgZXhwZWN0ZWQsIGludCBhY3R1YWwpewotCQl0cnl7Ci0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5FcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCl7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgYWN0dWFsKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBsb25nIGV4cGVjdGVkLCBsb25nIGFjdHVhbCl7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkVxdWFscyhTdHJpbmcgbWVzc2FnZSwgc2hvcnQgZXhwZWN0ZWQsIHNob3J0IGFjdHVhbCl7Ci0JCXRyeXsKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkZhbHNlKGJvb2xlYW4gY29uZGl0aW9uKXsKLQkJdHJ5ewotCQkJYXNzZXJ0RmFsc2UoY29uZGl0aW9uKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybkZhbHNlKFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGNvbmRpdGlvbil7Ci0JCXRyeXsKLQkJCWFzc2VydEZhbHNlKG1lc3NhZ2UsIGNvbmRpdGlvbik7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5Ob3ROdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuTm90TnVsbChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQl0cnl7Ci0JCQlhc3NlcnROb3ROdWxsKG1lc3NhZ2UsIG9iamVjdCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5Ob3RTYW1lKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnROb3RTYW1lKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuTm90U2FtZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydE5vdFNhbWUobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5OdWxsKE9iamVjdCBvYmplY3QpIHsKLQkJdHJ5ewotCQkJYXNzZXJ0TnVsbChvYmplY3QpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuTnVsbChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQl0cnl7Ci0JCQlhc3NlcnROdWxsKG1lc3NhZ2UsIG9iamVjdCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5TYW1lKE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgewotCQl0cnl7Ci0JCQlhc3NlcnRTYW1lKGV4cGVjdGVkLCBhY3R1YWwpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuU2FtZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0JCXRyeXsKLQkJCWFzc2VydFNhbWUobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm5UcnVlKGJvb2xlYW4gY29uZGl0aW9uKXsKLQkJdHJ5ewotCQkJYXNzZXJ0VHJ1ZShjb25kaXRpb24pOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuVHJ1ZShTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBjb25kaXRpb24pewotCQl0cnl7Ci0JCQlhc3NlcnRUcnVlKG1lc3NhZ2UsIGNvbmRpdGlvbik7Ci0JCX0gY2F0Y2goQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSl7Ci0JCQl3YXJuaW5ncy5hZGQoZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm4oKSB7Ci0JCXRyeXsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaChBc3NlcnRpb25GYWlsZWRFcnJvciBlKXsKLQkJCXdhcm5pbmdzLmFkZChlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybihTdHJpbmcgbWVzc2FnZSkgewotCQl0cnl7Ci0JCQlmYWlsKG1lc3NhZ2UpOwotCQl9IGNhdGNoKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpewotCQkJd2FybmluZ3MuYWRkKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcldhcm5pbmdzKCl7Ci0JCXdhcm5pbmdzLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCA8QXNzZXJ0aW9uRmFpbGVkRXJyb3I+IGdldFdhcm5pbmdzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh3YXJuaW5ncyk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0Jhc2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0Jhc2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDAyOGNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9CYXNlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGNsYXNzIEJhc2VUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGZGYWlsT25Mb2dnZWRTdGF0dXMgPSB0cnVlOwotCQotCS8qKgotCSAqIAotCSAqLyAKLQlwdWJsaWMgQmFzZVRlc3RDYXNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEJhc2VUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsgCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQlzZXRVcCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHRlYXJEb3duVGVzdCgpIHRocm93cyBFeGNlcHRpb24geyAKLQkJdGVhckRvd24oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1bkJhcmUoKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJ1bkNvcmVUZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7IAotCQlydW5UZXN0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQkvL1RPRE8gcmVnaXN0ZXIgYW55IHBsdWdpbnMgd2l0aCB0aGUgSlVuaXRMb2dMaXN0ZW5lciBoZXJlIHRoYXQgeW91IHdhbnQgdG8gZmFpbCBvbiB3aGVuIHRoZWlyIGxvZyBpcyB3cml0dGVuIHRvbwotCQkvL0VYOiBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5nZXRMb2coKS5hZGRMb2dMaXN0ZW5lcihKVW5pdExvZ0xpc3RlbmVyLklOU1RBTkNFKTsKLQotCQkvL2xpc3Qgb2YgcGx1Z2lucyB3aG9zIGxvZ3MgaWYgd3JpdHRlbiB0byB3aWxsIGNhdXNlIEpVbml0cyB0byBmYWlsCi0vLwkJQXJyYXlMaXN0PFN0cmluZz4gcGx1Z2luSURzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQotCQkvL1RPRE8gdW5jb21tZW50IHRoZXNlIHRvIG1ha2UgdGVzdHMgc3RhcnQgZmFpbGluZyBvbiBsb2dnZWQgZXJyb3JzCi0vLwkJcGx1Z2luSURzLmFkZChKRU1VdGlsUGx1Z2luLklEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvbnRyb2xsZXIiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLnVpIik7Ci0vLwkJcGx1Z2luSURzLmFkZChDb21tb25GcmFtZXdvcmtzUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChFSkJVSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoSjJFRVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoSjJFRUNvcmVQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEVqYlBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoTW9kZWxQbHVnaW4uUExVR0lOSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5hbm5vdGF0aW9ucy5lbWl0dGVyIik7Ci0vLwkJcGx1Z2luSURzLmFkZChYRG9jbGV0QW5ub3RhdGlvblBsdWdpbi5QTFVHSU5JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKY2FQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEpDQVVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFTmF2aWdhdG9yUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKMkVFVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFdlYlBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV2ViU2VydmljZVVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChKRUVQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEFjdGl2YXRvci5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5BY3RpdmF0b3IuUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFNlcnZsZXRVSVBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoQlZUVmFsaWRhdGlvblBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoRWNvcmVVdGlsaXRpZXNQbHVnaW4uSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoRU1GV29ya2JlbmNoRWRpdFBsdWdpbi5JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChXVFBDb21tb25QbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFdUUFVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChNb2R1bGVjb3JlUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZChWYWxpZGF0aW9uVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKFdTVFdlYlBsdWdpbi5QTFVHSU5fSUQpOwotLy8JCXBsdWdpbklEcy5hZGQoV1NUV2ViVUlQbHVnaW4uUExVR0lOX0lEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qZW0iKTsKLS8vCQlwbHVnaW5JRHMuYWRkKEJlYW5pbmZvUGx1Z2luLlBJX0JFQU5JTkZPX1BMVUdJTklEKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qZW0ucHJveHkiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qZW0udWkiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuamVtLnRlc3RzIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKENvbW1vblRlc3RzUGx1Z2luLlBMVUdJTl9JRCk7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3IiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLnVpIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UiKTsKLS8vCQlwbHVnaW5JRHMuYWRkKCJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cyIpOwotLy8JCXBsdWdpbklEcy5hZGQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlIik7Ci0vLwkJcGx1Z2luSURzLmFkZCgib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMiKTsJCi0KLS8vCQlmb3IoU3RyaW5nIHBsdWdpbklEIDogcGx1Z2luSURzKSB7Ci0vLwkJCUludGVybmFsUGxhdGZvcm0uZ2V0RGVmYXVsdCgpLmdldExvZyhJbnRlcm5hbFBsYXRmb3JtLmdldERlZmF1bHQoKS5nZXRCdW5kbGUocGx1Z2luSUQpKS5hZGRMb2dMaXN0ZW5lcihKVW5pdExvZ0xpc3RlbmVyLklOU1RBTkNFKTsKLS8vCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCB3ZWF0aGVyIHRvIGZhaWwganVuaXQgdGVzdHMgb24gc3RhdHVzIGxvZ2dlZCB0byBwbHVnaW5zIHJlZ2lzdGVyZWQgd2l0aCB0aGUgPGNvZGU+SlVuaXRMb2dMaXN0ZW5lcjwvY29kZT4KLQkgKiBEZWZhdWx0IHZhbHVlIGlzIHNldCB0byB0cnVlLgotCSAqIAotCSAqIEBwYXJhbSBmYWlsT25Mb2dnZWRTdGF0dXMKLQkgKiAJCQlpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGZhaWwgdGVzdHMgd2hlbiBzdGF0dXNlcyBsb2dnZWQgdG8gcGx1Z2lucyByZWdpc3RlcmVkIHdpdGggPGNvZGU+SlVuaXRMb2dMaXN0ZW5lcjwvY29kZT4sCi0JICogCQkJaWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHRoZW4gZG9udCBmYWlsIG9uIGxvZ2dlZCBzdGF0dXNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmFpbE9uTG9nZ2VkU3RhdHVzKGJvb2xlYW4gZmFpbE9uTG9nZ2VkU3RhdHVzKSB7Ci0JCWZGYWlsT25Mb2dnZWRTdGF0dXMgPSBmYWlsT25Mb2dnZWRTdGF0dXM7Ci0JfQotCi0vLwlAT3ZlcnJpZGUKLS8vCXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotLy8JCXRyeXsKLS8vCQkJQXNzZXJ0V2Fybi5jbGVhcldhcm5pbmdzKCk7Ci0vLwkJCXN1cGVyLnJ1bihyZXN1bHQpOwotLy8JCQkKLS8vCQl9IGZpbmFsbHkgewotLy8JCQlMaXN0IDxTdGFja1RyYWNlRWxlbWVudD4gc3RhY2tUcmFjZSA9IG5ldyBBcnJheUxpc3Q8U3RhY2tUcmFjZUVsZW1lbnQ+KCk7Ci0vLwkJCQotLy8JCQkvL2NoZWNrIHRvIHNlZSBpZiB0aGlzIHRlc3QgYWxyZWFkeSBmYWlsZWQgd2l0aCBhbiBlcnJvcgotLy8JCQkvL2lmIHNvIGFkZCBlcnJvciB0byBzdGFjayB0cmFjZQotLy8JCQlFbnVtZXJhdGlvbiBlcnJvcnNFbnVtID0gcmVzdWx0LmVycm9ycygpOwotLy8JCQlUZXN0RmFpbHVyZSBlcnJvck9yRmFpbHVyZSA9IG51bGw7Ci0vLwkJCWJvb2xlYW4gaGFkRXJyb3IgPSBmYWxzZTsKLS8vCQkJZm9yKGludCBpID0gMDsgZXJyb3JzRW51bS5oYXNNb3JlRWxlbWVudHMoKSAmJiAhaGFkRXJyb3I7IGkrKykgewotLy8JCQkJT2JqZWN0IG8gPSBlcnJvcnNFbnVtLm5leHRFbGVtZW50KCk7Ci0vLwkJCQllcnJvck9yRmFpbHVyZSA9IChUZXN0RmFpbHVyZSlvOwotLy8JCQkJaWYoZXJyb3JPckZhaWx1cmUuZmFpbGVkVGVzdCgpID09IHRoaXMpIHsKLS8vCQkJCQloYWRFcnJvciA9IHRydWU7Ci0vLwkJCQkJCi0vLwkJCQkJVGhyb3dhYmxlIHRocm93biA9IGVycm9yT3JGYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpOwotLy8JCQkJCUxpc3Q8U3RhY2tUcmFjZUVsZW1lbnQ+IGVycm9yVHJhY2UgPSBBcnJheXMuYXNMaXN0KHRocm93bi5nZXRTdGFja1RyYWNlKCkpOwotLy8JCQkJCXN0YWNrVHJhY2UuYWRkQWxsKGVycm9yVHJhY2UpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCQotLy8JCQkvL2NoZWNrIHRvIHNlZSBpZiB0aGlzIHRlc3QgYWxyZWFkeSBmYWlsZWQgd2l0aCBhIGZhaWx1cmUgaWYgaXQgZGlkbid0Ci0vLwkJCS8vIGZhaWwgd2l0aCBhbiBlcnJvci4gaWYgc28gYWRkIGZhaWx1cmUgdG8gc3RhY2sgdHJhY2UKLS8vCQkJYm9vbGVhbiBoYWRGYWlsdXJlID0gZmFsc2U7Ci0vLwkJCWlmKCFoYWRFcnJvcikgewotLy8JCQkJRW51bWVyYXRpb24gZmFpbHVyZXNFbnVtID0gcmVzdWx0LmZhaWx1cmVzKCk7Ci0vLwkJCQlmb3IoaW50IGkgPSAwOyBmYWlsdXJlc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkgJiYgIWhhZEZhaWx1cmU7IGkrKykgewotLy8JCQkJCU9iamVjdCBvID0gZmFpbHVyZXNFbnVtLm5leHRFbGVtZW50KCk7Ci0vLwkJCQkJZXJyb3JPckZhaWx1cmUgPSAoVGVzdEZhaWx1cmUpbzsKLS8vCQkJCQlpZihlcnJvck9yRmFpbHVyZS5mYWlsZWRUZXN0KCkgPT0gdGhpcykgewotLy8JCQkJCQloYWRGYWlsdXJlID0gdHJ1ZTsKLS8vCQkJCQkJCi0vLwkJCQkJCVRocm93YWJsZSB0aHJvd24gPSBlcnJvck9yRmFpbHVyZS50aHJvd25FeGNlcHRpb24oKTsKLS8vCQkJCQkJTGlzdDxTdGFja1RyYWNlRWxlbWVudD4gZmFpbHVyZVRyYWNlID0gQXJyYXlzLmFzTGlzdCh0aHJvd24uZ2V0U3RhY2tUcmFjZSgpKTsKLS8vCQkJCQkJc3RhY2tUcmFjZS5hZGRBbGwoZmFpbHVyZVRyYWNlKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCS8vYWRkIGFueSB3YXJuaW5ncyB0byB0aGUgc3RhY2sgdHJhY2UgYW5kIGRlYWwgd2l0aCBpZiB0aGlzIHRlc3QgYWxyZWFkeSBmYWlsZWQKLS8vCQkJTGlzdCA8QXNzZXJ0aW9uRmFpbGVkRXJyb3I+IHdhcm5pbmdzID0gQXNzZXJ0V2Fybi5nZXRXYXJuaW5ncygpOwotLy8JCQlib29sZWFuIGhhZFdhcm5pbmdzID0gd2FybmluZ3Muc2l6ZSgpICE9IDA7Ci0vLwkJCWlmKGhhZFdhcm5pbmdzKSB7Ci0vLwkJCQlpbnQgd2FybmluZ051bSA9IDE7Ci0vLwkJCQlMaXN0PFN0YWNrVHJhY2VFbGVtZW50PiB3YXJuaW5nVHJhY2UgPSBudWxsOwotLy8JCQkJZm9yKEFzc2VydGlvbkZhaWxlZEVycm9yIGUgOiB3YXJuaW5ncyl7Ci0vLwkJCQkJc3RhY2tUcmFjZS5hZGQobmV3IFN0YWNrVHJhY2VFbGVtZW50KCItLS0tLS0tLS0tPiIsIiIsICJXQVJOSU5HIE1FU1NBR0U6ICIgKyBlLmdldE1lc3NhZ2UoKSArICIpICAoV0FSTklORyBOVU1CRVIiLCB3YXJuaW5nTnVtKyspKTsKLS8vCQkJCQkKLS8vCQkJCQl3YXJuaW5nVHJhY2UgPSBBcnJheXMuYXNMaXN0KGUuZ2V0U3RhY2tUcmFjZSgpKTsKLS8vCQkJCQlzdGFja1RyYWNlLmFkZEFsbCh3YXJuaW5nVHJhY2UpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCQotLy8JCQkvL2FkZCBhbnkgbG9nZ2VkIHN0YXR1c2VzIHRvIHRoZSBzdGFjayB0cmFjZSwgYXMgbG9uZyBhcyBmRmFpbE9uTG9nZ2VkU3RhdHVzID09IHRydWUKLS8vCQkJSGFzaE1hcDxJU3RhdHVzLFN0cmluZz4gbG9nZ2VkU3RhdHVzZXMgPSBKVW5pdExvZ0xpc3RlbmVyLklOU1RBTkNFLmdldExvZ2dlZFN0YXR1c2VzKCk7Ci0vLwkJCWJvb2xlYW4gaGFkTG9nZ2VkU3RhdHVzZXMgPSBsb2dnZWRTdGF0dXNlcy5zaXplKCkgIT0gMDsKLS8vCQkJaWYoaGFkTG9nZ2VkU3RhdHVzZXMgJiYgZkZhaWxPbkxvZ2dlZFN0YXR1cykgewotLy8JCQkJaW50IGxvZ2dlZE1lc3NhZ2VOdW0gPSAxOwotLy8JCQkJTGlzdDxTdGFja1RyYWNlRWxlbWVudD4gbG9nZ2VkTWVzc2FnZVRyYWNlID0gbnVsbDsKLS8vCQkJCQotLy8JCQkJU2V0PElTdGF0dXM+IGxvZ2dlZFN0YXR1c2VzS2V5cyA9IGxvZ2dlZFN0YXR1c2VzLmtleVNldCgpOwotLy8JCQkJU3RyaW5nIHN0YXR1c1R5cGU7Ci0vLwkJCQlmb3IoSVN0YXR1cyBzdGF0dXMgOiBsb2dnZWRTdGF0dXNlc0tleXMpIHsKLS8vCQkJCQlzdGFja1RyYWNlLmFkZChuZXcgU3RhY2tUcmFjZUVsZW1lbnQoIi0tLS0tLS0tLS0+IiwiIiwgIkxPR0dFRCAiICsgc3RhdHVzVHlwZVRvU3RyaW5nKHN0YXR1cy5nZXRTZXZlcml0eSgpKSArICIgU1RBVFVTOiAiICsgbG9nZ2VkU3RhdHVzZXMuZ2V0KHN0YXR1cykgKyAiOiAiICsgc3RhdHVzLmdldE1lc3NhZ2UoKSArICIpICAoTE9HR0VEIFNUQVRVUyBOVU1CRVIiLCBsb2dnZWRNZXNzYWdlTnVtKyspKTsKLS8vCQkJCQkKLS8vCQkJCQlpZihzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotLy8JCQkJCQlsb2dnZWRNZXNzYWdlVHJhY2UgPSBBcnJheXMuYXNMaXN0KHN0YXR1cy5nZXRFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCkpOwotLy8JCQkJCQlzdGFja1RyYWNlLmFkZEFsbChsb2dnZWRNZXNzYWdlVHJhY2UpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQkJLy9kZWFsIHdpdGggbWFraW5nIGEgbmV3IGZvcm1hdGVkIGZhaWx1cmUgYW5kIGFkZGVkIGl0IHRvIHRoZSByZXN1bHQKLS8vCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLS8vCQkJU3RyaW5nIHdhcm5pbmdzTWVzc2FnZSA9ICJUZXN0IGhhZCAiICsgd2FybmluZ3Muc2l6ZSgpICsgIiB3YXJuaW5ncyBvY2N1ciI7Ci0vLwkJCVN0cmluZyBsb2dnZWRTdGF0dXNlc01lc3NhZ2UgPSAiVGVzdCBsb2dnZWQgIiArIGxvZ2dlZFN0YXR1c2VzLnNpemUoKSArICIgc3RhdHVzZXMiOwotLy8JCQlpZihoYWRFcnJvciB8fCBoYWRGYWlsdXJlKSB7Ci0vLwkJCQltZXNzYWdlID0gZXJyb3JPckZhaWx1cmUuZXhjZXB0aW9uTWVzc2FnZSgpOwotLy8JCQkJCi0vLwkJCQlpZihoYWRXYXJuaW5ncykgewotLy8JCQkJCW1lc3NhZ2UgKz0gIiAgKCIgKyB3YXJuaW5nc01lc3NhZ2UgKyAiKSI7Ci0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJCWlmKGhhZExvZ2dlZFN0YXR1c2VzICYmIGZGYWlsT25Mb2dnZWRTdGF0dXMpIHsKLS8vCQkJCQltZXNzYWdlICs9ICIgICgiICsgbG9nZ2VkU3RhdHVzZXNNZXNzYWdlICsgIikiOwotLy8JCQkJfQotLy8JCQl9IGVsc2UgaWYoaGFkV2FybmluZ3MpIHsKLS8vCQkJCW1lc3NhZ2UgPSB3YXJuaW5nc01lc3NhZ2U7Ci0vLwkJCQkKLS8vCQkJCWlmKGhhZExvZ2dlZFN0YXR1c2VzICYmIGZGYWlsT25Mb2dnZWRTdGF0dXMpIHsKLS8vCQkJCQltZXNzYWdlICs9ICIgICgiICsgbG9nZ2VkU3RhdHVzZXNNZXNzYWdlICsgIikiOwotLy8JCQkJfQotLy8JCQl9IGVsc2UgaWYoaGFkTG9nZ2VkU3RhdHVzZXMgJiYgZkZhaWxPbkxvZ2dlZFN0YXR1cykgewotLy8JCQkJbWVzc2FnZSA9IGxvZ2dlZFN0YXR1c2VzTWVzc2FnZTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJaWYoaGFkRXJyb3IgfHwgaGFkRmFpbHVyZSB8fCBoYWRXYXJuaW5ncyB8fCAoaGFkTG9nZ2VkU3RhdHVzZXMgJiYgZkZhaWxPbkxvZ2dlZFN0YXR1cykpIHsKLS8vCQkJCUFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yID0gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKG1lc3NhZ2UpOwotLy8JCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlQXJyYXkgPSBzdGFja1RyYWNlLnRvQXJyYXkobmV3IFN0YWNrVHJhY2VFbGVtZW50W3N0YWNrVHJhY2Uuc2l6ZSgpXSk7Ci0vLwkJCQllcnJvci5zZXRTdGFja1RyYWNlKHN0YWNrVHJhY2VBcnJheSk7Ci0vLwotLy8JCQkJaWYoaGFkRXJyb3IpIHsKLS8vCQkJCQlyZXN1bHQuYWRkRXJyb3IodGhpcywgZXJyb3IpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlyZXN1bHQuYWRkRmFpbHVyZSh0aGlzLCBlcnJvcik7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwotLy8JCX0KLS8vCX0KLQkKLQlwcml2YXRlIFN0cmluZyBzdGF0dXNUeXBlVG9TdHJpbmcoaW50IHN0YXR1c1R5cGUpIHsKLQkJU3RyaW5nIHNTdGF0dXNUeXBlID0gIiI7Ci0JCXN3aXRjaCAoc3RhdHVzVHlwZSkgewotCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQlzU3RhdHVzVHlwZSA9ICJFUlJPUiI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuQ0FOQ0VMIDoKLQkJCQlzU3RhdHVzVHlwZSA9ICJDQU5DRUwiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOiAKLQkJCQlzU3RhdHVzVHlwZSA9ICJXQVJOSU5HIjsKLQkJCQlicmVhazsKLQkJfQotCQkKLQkJcmV0dXJuIHNTdGF0dXNUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Db21tb25UZXN0c1BsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWY2Y2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25UZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiOwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uVGVzdHNQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCXB1YmxpYyBJRXh0ZW5zaW9uUG9pbnQgZGF0YU1vZGVsVmVyaWZpZXJFeHQgPSBudWxsOwotCQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIENvbW1vblRlc3RzUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJZGF0YU1vZGVsVmVyaWZpZXJFeHQgPSBkZXNjcmlwdG9yLmdldEV4dGVuc2lvblBvaW50KCJEYXRhTW9kZWxWZXJpZmllciIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwM2Q1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsVmVyaWZpZXIgewotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5KElEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24geyAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliNjUwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIEBhdXRob3IgSWFuIFRld2tzYnVyeSAoaWN0ZXdrc2JAdXMuaWJtLmNvbSkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5IGV4dGVuZHMgUmVnaXN0cnlSZWFkZXJ7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX01PREVMX1ZFUklGSUVSX0xJU1RfRVhUID0gImRhdGFNb2RlbFZlcmlmaWVyTGlzdCI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0NMQVNTID0gImxpc3RDbGFzcyI7Ci0JcHJpdmF0ZSBNYXAgZGF0YU1vZGVsVmVyaWZpZXJzTWFwID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgRGF0YU1vZGVsVmVyaWZpZXIgZGVmYXVsdERhdGFNb2RlbFZlcmlmaWVyID0gbmV3IERhdGFNb2RlbFZlcmlmaWVyKCk7Ci0JCi0JcHVibGljIERhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoQ29tbW9uVGVzdHNQbHVnaW4uUExVR0lOX0lELCAiRGF0YU1vZGVsVmVyaWZpZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCl7Ci0JCQlpbnN0YW5jZSA9IG5ldyBEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXIjcmVhZEVsZW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhEQVRBX01PREVMX1ZFUklGSUVSX0xJU1RfRVhUKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCURhdGFNb2RlbFZlcmlmaWVyTGlzdCBsaXN0ID0gKERhdGFNb2RlbFZlcmlmaWVyTGlzdCllbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTElTVF9DTEFTUyk7Ci0JCQlhZGRUb0RhdGFNb2RlbFZlcmlmaWVyc01hcChsaXN0LmdldERhdGFNb2RlbFZlcmlmaWVycygpKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRUb0RhdGFNb2RlbFZlcmlmaWVyc01hcChNYXAgZGF0YU1vZGVsVmVyaWZpZXJzKXsKLQkJaWYgKGRhdGFNb2RlbFZlcmlmaWVyc01hcCA9PSBudWxsKQotCQkJZGF0YU1vZGVsVmVyaWZpZXJzTWFwID0gaW5pdERhdGFNb2RlbFZlcmlmaWVyc01hcCgpOwotCQlkYXRhTW9kZWxWZXJpZmllcnNNYXAucHV0QWxsKGRhdGFNb2RlbFZlcmlmaWVycyk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGF0YU1vZGVsVmVyaWZpZXJzTWFwLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RGF0YU1vZGVsVmVyaWZpZXJzTWFwKCkgewotCQlpZiAoZGF0YU1vZGVsVmVyaWZpZXJzTWFwID09IG51bGwpIHsKLQkJCWRhdGFNb2RlbFZlcmlmaWVyc01hcCA9IGluaXREYXRhTW9kZWxWZXJpZmllcnNNYXAoKTsKLQkJfQotCQlyZXR1cm4gZGF0YU1vZGVsVmVyaWZpZXJzTWFwOwotCX0KLQotCXByb3RlY3RlZCBNYXAgaW5pdERhdGFNb2RlbFZlcmlmaWVyc01hcCgpIHsKLQkJcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0RGF0YU1vZGVsVmVyaWZpZXIuCi0JICovCi0JcHJvdGVjdGVkIERhdGFNb2RlbFZlcmlmaWVyIGdldERlZmF1bHREYXRhTW9kZWxWZXJpZmllcigpIHsKLQkJcmV0dXJuIGRlZmF1bHREYXRhTW9kZWxWZXJpZmllcjsKLQl9Ci0JCi0JICAvKnByaXZhdGUgdm9pZCBsb2FkQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgLy9UZXN0Q29sbGVjdG9yUGx1Z2luIHBsdWdpbiA9IFRlc3RDb2xsZWN0b3JQbHVnaW4uaW5zdGFuY2U7Ci0JICAJQ29tbW9uVGVzdHNQbHVnaW4gcGx1Z2luID0gQ29tbW9uVGVzdHNQbHVnaW4uaW5zdGFuY2U7Ci0gICAgICAgIElFeHRlbnNpb25bXSBkYXRhTW9kZWxWZXJpZmllckV4dHMgPSBwbHVnaW4uZGF0YU1vZGVsVmVyaWZpZXJFeHQuZ2V0RXh0ZW5zaW9ucygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YU1vZGVsVmVyaWZpZXJFeHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGRhdGFNb2RlbFZlcmlmaWVyRXh0c1tpXTsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY3RvcmllcyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmFjdG9yaWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBmYWN0b3JpZXNbal07Ci0gICAgICAgICAgICAgICAgICAgIERhdGFNb2RlbFZlcmlmaWVyTGlzdCBsaXN0ID0gKERhdGFNb2RlbFZlcmlmaWVyTGlzdCllbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImxpc3RDbGFzcyIpOwotICAgICAgICAgICAgICAgICAgICAvL0NsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gKENsYXNzTG9hZGVyKSBleHRlbnNpb24uZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vRGF0YU1vZGVsVmVyaWZpZXJMaXN0IGxpc3QgPSAoRGF0YU1vZGVsVmVyaWZpZXJMaXN0KSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoZmFjdG9yeUNsYXNzKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBhZGRUb0RhdGFNb2RlbFZlcmlmaWVyc01hcChsaXN0LmdldERhdGFNb2RlbFZlcmlmaWVycygpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0qLwotCQotCXB1YmxpYyBEYXRhTW9kZWxWZXJpZmllciBjcmVhdGVWZXJpZmllcihJRGF0YU1vZGVsIG1vZGVsKSAgewotCQlEYXRhTW9kZWxWZXJpZmllciB2ZXJpZmllciA9IGdldERlZmF1bHREYXRhTW9kZWxWZXJpZmllcigpOwotCQkKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCU9iamVjdCB2ZXJpZmllck9iamVjdCA9IGdldERhdGFNb2RlbFZlcmlmaWVyc01hcCgpLmdldChtb2RlbC5nZXRJRCgpKTsKLQkJCWlmKHZlcmlmaWVyT2JqZWN0ICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCWlmKHZlcmlmaWVyT2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MpewotCQkJCQkJcmV0dXJuIChEYXRhTW9kZWxWZXJpZmllcikoKENsYXNzKXZlcmlmaWVyT2JqZWN0KS5uZXdJbnN0YW5jZSgpOwotCQkJCQl9IGVsc2UgaWYodmVyaWZpZXJPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpewotCQkJCQkJQ2xhc3MgdmVyaWZpZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoKFN0cmluZyl2ZXJpZmllck9iamVjdCk7Ci0JCQkJCQl2ZXJpZmllciA9IChEYXRhTW9kZWxWZXJpZmllcikgdmVyaWZpZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0JCQkJCXZlcmlmaWVyID0gZ2V0RGVmYXVsdERhdGFNb2RlbFZlcmlmaWVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2ZXJpZmllcjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyTGlzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0RhdGFNb2RlbFZlcmlmaWVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzg2NTg4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9EYXRhTW9kZWxWZXJpZmllckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQGF1dGhvciBldGVyYXRpb24KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGFNb2RlbFZlcmlmaWVyTGlzdCB7Ci0JCi0JcHVibGljIGFic3RyYWN0IE1hcCBnZXREYXRhTW9kZWxWZXJpZmllcnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0pVbml0TG9nTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9KVW5pdExvZ0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2Y5ZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL0pVbml0TG9nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIGl0ZXdrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSlVuaXRMb2dMaXN0ZW5lciBpbXBsZW1lbnRzIElMb2dMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpVbml0TG9nTGlzdGVuZXIgSU5TVEFOQ0UgPSBuZXcgSlVuaXRMb2dMaXN0ZW5lcigpOwotCXByaXZhdGUgSGFzaE1hcDxJU3RhdHVzLCBTdHJpbmc+IGxvZ2dlZFN0YXR1c2VzID0gbmV3IEhhc2hNYXA8SVN0YXR1cywgU3RyaW5nPigpOwotCQotCXByaXZhdGUgSlVuaXRMb2dMaXN0ZW5lcigpIHsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklMb2dMaXN0ZW5lciNsb2dnaW5nKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ2dpbmcoSVN0YXR1cyBzdGF0dXMsIFN0cmluZyBwbHVnaW4pIHsKLQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCWlmKHNldmVyaXR5ID09IElTdGF0dXMuQ0FOQ0VMIHx8IHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlsb2dnZWRTdGF0dXNlcy5wdXQoc3RhdHVzLCBwbHVnaW4pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGlzdCBvZiBsb2dnZWQgc3RhdHVzZXMsIGNsZWFycyBsaXN0IGFmdGVyIHJldHVybi4KLQkgKi8KLQlwdWJsaWMgSGFzaE1hcDxJU3RhdHVzLFN0cmluZz4gZ2V0TG9nZ2VkU3RhdHVzZXMoKSB7Ci0JCUhhc2hNYXA8SVN0YXR1cyxTdHJpbmc+IHJldHVyblN0YXR1c2VzID0gbmV3IEhhc2hNYXA8SVN0YXR1cyxTdHJpbmc+KGxvZ2dlZFN0YXR1c2VzKTsKLQkJbG9nZ2VkU3RhdHVzZXMuY2xlYXIoKTsKLQkJcmV0dXJuIHJldHVyblN0YXR1c2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Mb2dVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvTG9nVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2QwMjhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Mb2dVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMzAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTG9nVXRpbGl0eSBpbXBsZW1lbnRzIElMb2dMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2dVdGlsaXR5IGluc3RhbmNlID0gbmV3IExvZ1V0aWxpdHkoKTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBsb2dnZWRNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbG9nZ2luZyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBMb2dVdGlsaXR5KCkgewotICAgICAgICByZWdpc3RlclBsdWdpbnMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJQbHVnaW5zKCkgewotLy8gICAgICBUT0RPIERDQiBEaXNhYmxlIGZvciBub3cgZHVlIHRvIG90aGVyIHBsdWdpbnMgZmFpbGluZy4KLS8vICAgICAgICBJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotLy8gICAgICAgIElQbHVnaW5EZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSByZWdpc3RyeS5nZXRQbHVnaW5EZXNjcmlwdG9ycygpOwotLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgIFBsdWdpbiBwbHVnaW4gPSBkZXNjcmlwdG9yc1tpXS5nZXRQbHVnaW4oKTsKLS8vICAgICAgICAgICAgICAgIElMb2cgbG9nID0gcGx1Z2luLmdldExvZygpOwotLy8gICAgICAgICAgICAgICAgbG9nLmFkZExvZ0xpc3RlbmVyKHRoaXMpOwotLy8gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTG9nVXRpbGl0eSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyTG9ncygpIHsKLSAgICAgICAgbG9nZ2VkTWVzc2FnZXMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldExvZ2dpbmcoKSB7Ci0gICAgICAgIHN0b3BMb2dnaW5nKCk7Ci0gICAgICAgIGNsZWFyTG9ncygpOwotICAgICAgICBzdGFydExvZ2dpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydExvZ2dpbmcoKSB7Ci0gICAgICAgIGxvZ2dpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3BMb2dnaW5nKCkgewotICAgICAgICBsb2dnaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmVyaWZ5Tm9XYXJuaW5ncygpIHsKLSAgICAJLy9UT0RPIERDQiBEaXNhYmxlIGZvciBub3cgZHVlIHRvIG90aGVyIHBsdWdpbnMgZmFpbGluZy4KLS8vICAgICAgICBTdHJpbmcgd2FybmluZ3MgPSAiIjsKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvZ2dlZE1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0vLyAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gKElTdGF0dXMpIGxvZ2dlZE1lc3NhZ2VzLmdldChpKTsKLS8vICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0vLyAgICAgICAgICAgICAgICB3YXJuaW5ncyArPSAiXG5Mb2dVdGlsaXR5OiAiICsgKChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpID8gIldBUk5JTkcgIiA6ICJFUlJPUiAiKTsKLS8vICAgICAgICAgICAgICAgIHdhcm5pbmdzICs9ICJcbkZyb20gcGx1Z2luOiAiICsgKChudWxsICE9IHN0YXR1cy5nZXRQbHVnaW4oKSkgPyBzdGF0dXMuZ2V0UGx1Z2luKCkgOiAibnVsbCIpOwotLy8gICAgICAgICAgICAgICAgd2FybmluZ3MgKz0gIlxuTWVzc2FnZTogIiArICgobnVsbCAhPSBzdGF0dXMuZ2V0TWVzc2FnZSgpKSA/IHN0YXR1cy5nZXRNZXNzYWdlKCkgOiAibnVsbCIpOwotLy8gICAgICAgICAgICAgICAgd2FybmluZ3MgKz0gIlxuU3RhY2s6XG4iOwotLy8gICAgICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotLy8gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50U3RyZWFtKG91dHB1dFN0cmVhbSkpOwotLy8gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzICs9IG91dHB1dFN0cmVhbS50b1N0cmluZygpOwotLy8gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyArPSAiIFN0YWNrIG5vdCBhdmFpbGFibGUiOwotLy8gICAgICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAoIXdhcm5pbmdzLmVxdWFscygiIikpIHsKLS8vICAgICAgICAgICAgQXNzZXJ0LmZhaWwod2FybmluZ3MpOwotLy8gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2dnaW5nKElTdGF0dXMgc3RhdHVzLCBTdHJpbmcgcGx1Z2luKSB7Ci0gICAgICAgIGlmIChsb2dnaW5nKSB7Ci0gICAgICAgICAgICBsb2dnZWRNZXNzYWdlcy5hZGQoc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9PcGVyYXRpb25UZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL09wZXJhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODhiYTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL09wZXJhdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDYsIDIwMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQKLSAqIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSVdvcmtzcGFjZVJ1bm5hYmxlV2l0aFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0aW9uQnVpbGRlcjsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiBAYXV0aG9yIGl0ZXdrCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb25UZXN0Q2FzZSBleHRlbmRzIEJhc2VUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfSk9CX0ZBTUlMWSA9ICJ2YWxpZGF0b3JzIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgIm9yZy5lY2xpcHNlLmplbS51dGlsIiwgMCwgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRyeXsgCi0JCQlkZWxldGVBbGxQcm9qZWN0cygpOwotCQl9IGZpbmFsbHkgewotCQkJUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsUHJvamVjdHMoKSB7Ci0JCXRyeSB7Ci0JCQl3YWl0T25Kb2JzKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkKLQkJfQotCQlJV29ya3NwYWNlUnVubmFibGVXaXRoU3RhdHVzIHdvcmtzcGFjZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZVdpdGhTdGF0dXMobnVsbCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3b3Jrc3BhY2VSdW5uYWJsZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgT3BlcmF0aW9uVGVzdENhc2UoKSB7Ci0JCXN1cGVyKCJPcGVyYXRpb25zVGVzdENhc2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPcGVyYXRpb25UZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuQW5kVmVyaWZ5KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3BlcmF0aW9uVGVzdENhc2UucnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5EYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlPcGVyYXRpb25UZXN0Q2FzZS5ydW5EYXRhTW9kZWwoZGF0YU1vZGVsLCB0cnVlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2cpIHRocm93cyBFeGNlcHRpb24gewotCQlPcGVyYXRpb25UZXN0Q2FzZS5ydW5EYXRhTW9kZWwoZGF0YU1vZGVsLCBjaGVja1Rhc2tzLCBjaGVja0xvZywgbnVsbCwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5BbmRWZXJpZnkoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJ1bkFuZFZlcmlmeShkYXRhTW9kZWwsIGNoZWNrVGFza3MsIGNoZWNrTG9nLCBudWxsLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFuZFZlcmlmeShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nLCBib29sZWFuIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpIHRocm93cyBFeGNlcHRpb24gewotCQlydW5BbmRWZXJpZnkoZGF0YU1vZGVsLCBjaGVja1Rhc2tzLCBjaGVja0xvZywgbnVsbCwgdHJ1ZSwgd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkFuZFZlcmlmeShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nLCBMaXN0IGVycm9yT0tMaXN0LCBib29sZWFuIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCwgY2hlY2tUYXNrcywgY2hlY2tMb2csIGVycm9yT0tMaXN0LCByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5BbmRWZXJpZnkoSURhdGFNb2RlbCBkYXRhTW9kZWwsIGJvb2xlYW4gY2hlY2tUYXNrcywgYm9vbGVhbiBjaGVja0xvZywgTGlzdCBlcnJvck9LTGlzdCwgYm9vbGVhbiByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgYm9vbGVhbiB3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCwgY2hlY2tUYXNrcywgY2hlY2tMb2csIGVycm9yT0tMaXN0LCByZXBvcnRJZkV4cGVjdGVkRXJyb3JOb3RGb3VuZCwgd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2csIExpc3QgZXJyb3JPS0xpc3QsIGJvb2xlYW4gcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIGJvb2xlYW4gd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJ1bkRhdGFNb2RlbChkYXRhTW9kZWwsIGNoZWNrVGFza3MsIGNoZWNrTG9nLCBlcnJvck9LTGlzdCwgcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHdWFyYW50ZWVkIHRvIGNsb3NlIHRoZSBkYXRhTW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuQW5kVmVyaWZ5KElEYXRhTW9kZWwgZGF0YU1vZGVsLCBib29sZWFuIGNoZWNrVGFza3MsIGJvb2xlYW4gY2hlY2tMb2csIExpc3QgZXJyb3JPS0xpc3QsIGJvb2xlYW4gcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIGJvb2xlYW4gd2FpdEZvckJ1aWxkVG9Db21wbGV0ZSwgYm9vbGVhbiByZW1vdmVBbGxTYW1lVHlwZXNPZkVycm9ycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBvc3RCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpIHsKLQkJCQlsaXN0ZW5lciA9IG5ldyBQb3N0QnVpbGRMaXN0ZW5lcigpOwotCQkJCWRlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZXNjLnNldEF1dG9CdWlsZGluZyhmYWxzZSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsKLQkJCX0KLQkJCQotCQkJLy9kZWFsIHdpdGggd2VhdGhlciB0byBmYWlsIG9uIGxvZ2dlZCBzdGF0dXNlcyBvciBub3QKLQkJCUJhc2VUZXN0Q2FzZS5mYWlsT25Mb2dnZWRTdGF0dXMoY2hlY2tMb2cpOwotCQkJCi0JCQlJU3RhdHVzIG9wZXJhdGlvblN0YXR1cyA9IGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQotCQkJaWYgKHdhaXRGb3JCdWlsZFRvQ29tcGxldGUpIHsKLQkJCQlkZXNjLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJd2hpbGUgKCFsaXN0ZW5lci5pc0J1aWxkQ29tcGxldGUoKSkgewotCQkJCQlUaHJlYWQuc2xlZXAoMzAwMCk7Ly8gZG8gbm90aGluZyB0aWxsIGFsbCB0aGUgam9icyBhcmUgY29tcGxldGVkCi0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBidWcgMTczOTMzIC0gcnVuQW5kVmVyaWZ5KCkgZmFpbHMgdG8gY2hlY2sgcmV0dXJuIElTdGF0dXMgCi0JCQlpZiAob3BlcmF0aW9uU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCVRocm93YWJsZSB0aHJvd2FibGUgPSBvcGVyYXRpb25TdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJU3RyaW5nIHRocm93YWJsZVN0ciA9IG51bGw7Ci0JCQkJaWYodGhyb3dhYmxlICE9IG51bGwpewotCQkJCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCXRocm93YWJsZVN0ciA9IGdldFN0YWNrVHJhY2UodGhyb3dhYmxlKTsKLQkJCQl9Ci0JCQkJaWYodGhyb3dhYmxlU3RyID09IG51bGwpewotCQkJCQl0aHJvd2FibGVTdHIgPSAibm8gbWVzc2FnZSI7Ci0JCQkJfQotCQkJCUFzc2VydC5mYWlsKG9wZXJhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCkrIlxuICAgIGNhdXNlZCBieTogIit0aHJvd2FibGVTdHIpOwotCQkJfQotCQkJCi0JCQkvL3J1biBkYXRhIG1vZGVsIHZlcmlmaWNhdGlvbnMKLQkJCURhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeSB2ZXJpZmllckZhY3RvcnkgPSBEYXRhTW9kZWxWZXJpZmllckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCURhdGFNb2RlbFZlcmlmaWVyIHZlcmlmaWVyID0gdmVyaWZpZXJGYWN0b3J5LmNyZWF0ZVZlcmlmaWVyKGRhdGFNb2RlbCk7Ci0JCQl2ZXJpZmllci52ZXJpZnkoZGF0YU1vZGVsKTsKLQotCQkJaWYgKGNoZWNrVGFza3MgJiYgKGVycm9yT0tMaXN0ID09IG51bGwgfHwgZXJyb3JPS0xpc3QuaXNFbXB0eSgpKSkgewotCQkJCWNoZWNrVGFza3NMaXN0KCk7Ci0JCQl9IGVsc2UgaWYgKGNoZWNrVGFza3MgJiYgZXJyb3JPS0xpc3QgIT0gbnVsbCAmJiAhZXJyb3JPS0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJVGFza1ZpZXdVdGlsaXR5LnZlcmlmeUVycm9ycyhlcnJvck9LTGlzdCwgcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIHJlbW92ZUFsbFNhbWVUeXBlc09mRXJyb3JzKTsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJZGF0YU1vZGVsLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdGFja1RyYWNlKFRocm93YWJsZSB0aHJvd2FibGUpewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0aHJvd2FibGUudG9TdHJpbmcoKSsiXG4iKTsKLQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFjayA9IHRocm93YWJsZS5nZXRTdGFja1RyYWNlKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzdGFjay5sZW5ndGg7IGkrKykKLQkJCWJ1ZmZlci5hcHBlbmQoIlx0YXQgIiArIHN0YWNrW2ldKyJcbiIpOwotCi0JCVN0YWNrVHJhY2VFbGVtZW50W10gcGFyZW50U3RhY2sgPSBzdGFjazsKLQkJdGhyb3dhYmxlID0gdGhyb3dhYmxlLmdldENhdXNlKCk7Ci0JCXdoaWxlICh0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiQ2F1c2VkIGJ5OiAiKTsKLQkJCWJ1ZmZlci5hcHBlbmQodGhyb3dhYmxlKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0JCQlTdGFja1RyYWNlRWxlbWVudFtdIGN1cnJlbnRTdGFjayA9IHRocm93YWJsZS5nZXRTdGFja1RyYWNlKCk7Ci0JCQlwYXJlbnRTdGFjayA9IGN1cnJlbnRTdGFjazsKLQkJCXRocm93YWJsZSA9IHRocm93YWJsZS5nZXRDYXVzZSgpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogR3VhcmFudGVlZCB0byBjbG9zZSB0aGUgZGF0YU1vZGVsCi0JICogCi0JICogQHBhcmFtIGRhdGFNb2RlbAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkRhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCwgYm9vbGVhbiBjaGVja1Rhc2tzLCBib29sZWFuIGNoZWNrTG9nLCBMaXN0IGVycm9yT0tMaXN0LCBib29sZWFuIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCBib29sZWFuIHdhaXRGb3JCdWlsZFRvQ29tcGxldGUsIGJvb2xlYW4gcmVtb3ZlQWxsU2FtZVR5cGVzT2ZFcnJvcnMpIHRocm93cyBFeGNlcHRpb24gewotCQlQb3N0QnVpbGRMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh3YWl0Rm9yQnVpbGRUb0NvbXBsZXRlKSB7Ci0JCQkJbGlzdGVuZXIgPSBuZXcgUG9zdEJ1aWxkTGlzdGVuZXIoKTsKLQkJCQlkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVzYy5zZXRBdXRvQnVpbGRpbmcoZmFsc2UpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCk7Ci0JCQl9Ci0JCQkKLQkJCS8vZGVhbCB3aXRoIHdlYXRoZXIgdG8gZmFpbCBvbiBsb2dnZWQgc3RhdHVzZXMgb3Igbm90Ci0JCQlCYXNlVGVzdENhc2UuZmFpbE9uTG9nZ2VkU3RhdHVzKGNoZWNrTG9nKTsKLQkJCQotCQkJZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJCi0JCQlpZiAod2FpdEZvckJ1aWxkVG9Db21wbGV0ZSkgewotCQkJCWRlc2Muc2V0QXV0b0J1aWxkaW5nKHRydWUpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJCQl3aGlsZSAoIWxpc3RlbmVyLmlzQnVpbGRDb21wbGV0ZSgpKSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgzMDAwKTsvLyBkbyBub3RoaW5nIHRpbGwgYWxsIHRoZSBqb2JzIGFyZSBjb21wbGV0ZWxlZAotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGVja1Rhc2tzICYmIChlcnJvck9LTGlzdCA9PSBudWxsIHx8IGVycm9yT0tMaXN0LmlzRW1wdHkoKSkpIHsKLQkJCQljaGVja1Rhc2tzTGlzdCgpOwotCQkJfSBlbHNlIGlmIChjaGVja1Rhc2tzICYmIGVycm9yT0tMaXN0ICE9IG51bGwgJiYgIWVycm9yT0tMaXN0LmlzRW1wdHkoKSkgewotCQkJCVRhc2tWaWV3VXRpbGl0eS52ZXJpZnlFcnJvcnMoZXJyb3JPS0xpc3QsIHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kLCByZW1vdmVBbGxTYW1lVHlwZXNPZkVycm9ycyk7Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWRhdGFNb2RlbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjaGVja1Rhc2tzTGlzdCgpIHsKLQkJLy9UYXNrVmlld1V0aWxpdHkudmVyaWZ5Tm9FcnJvcnMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5VmFsaWREYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBkYXRhTW9kZWwudmFsaWRhdGUoKTsKLQotCQlpZiAoIXN0YXR1cy5pc09LKCkgJiYgc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJQXNzZXJ0LmFzc2VydFRydWUoIkRhdGFNb2RlbCBpcyBpbnZhbGlkIG9wZXJhdGlvbiB3aWxsIG5vdCBydW46IiArIHN0YXR1cy50b1N0cmluZygpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlJbnZhbGlkRGF0YU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZGF0YU1vZGVsLnZhbGlkYXRlKCk7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiRGF0YU1vZGVsIHNob3VsZCBiZSBpbnZhbGlkOiIgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkvLyBXYWl0IGZvciBhbGwgdmFsaWRhdGlvbiBqb2JzIHRvIGVuZCBiZWZvcmUgZW5kaW5nIHRlc3QuLi4uCi0JCXdhaXRPbkpvYnMoKTsKLQkJCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRPbkpvYnMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUHJvamVjdFV0aWxpdHkuZ2V0QWxsUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKHByb2plY3QuZ2V0TmFtZSgpICsgVkFMSURBVE9SX0pPQl9GQU1JTFksbnVsbCk7Ci0JCX0KLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxELG51bGwpOwotCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELG51bGwpOwotCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oVmFsaWRhdGlvbkJ1aWxkZXIuRkFNSUxZX1ZBTElEQVRJT05fSk9CLG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9QbGF0Zm9ybU1vZHVsZVVSTFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9QbGF0Zm9ybU1vZHVsZVVSTFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5N2Y2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUGxhdGZvcm1Nb2R1bGVVUkxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1Nb2R1bGVVUkxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIFBsYXRmb3JtTW9kdWxlVVJMVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQbGF0Zm9ybU1vZHVsZVVSTFRlc3QuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uc3RhcnR1cCgpOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVSTFJlc29sdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoInBsYXRmb3JtOi9tb2R1bGU6L015TW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sIik7Ci0gICAgICAgIFVSTENvbm5lY3Rpb24gY29ueCA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY29ueC5nZXRVUkwoKSk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvUG9zdEJ1aWxkTGlzdGVuZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Qb3N0QnVpbGRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2Y0MTkyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Qb3N0QnVpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBuaXJhdgotICovCi1wdWJsaWMgY2xhc3MgUG9zdEJ1aWxkTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGJ1aWxkQ29tcGxldGUgPSBmYWxzZTsKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCl7Ci0gICAgICAgICAgYnVpbGRDb21wbGV0ZSA9IHRydWU7ICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQnVpbGRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkQ29tcGxldGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZSgpIHsKLSAgICAgICAgYnVpbGRDb21wbGV0ZSA9IGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9Qcm9qZWN0VXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Byb2plY3RVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZmViZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Byb2plY3RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6IFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8KLSAqIGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgY3JlYXRpb24gb2YgdHlwZSBjb21tZW50cyBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VXRpbGl0eSB7Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEFsbFByb2plY3RzKCkgewotICAgIAlJUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElQcm9qZWN0WzBdOwotICAgIAl0cnkgewotICAgICAgICBwcm9qZWN0cyA9ICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleCkgewotICAgIAkJLy8gQ2F0Y2ggTWFsZm9ybWVkIHRyZWUgZXhjZXB0aW9uIHRoYXQgb2NjdXJzIGZyb20gdGltZSB0byB0aW1lLi4uCi0gICAgCX0KLSAgICAJcmV0dXJuIHByb2plY3RzOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvamVjdEV4aXN0cyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb2plY3QocHJvamVjdE5hbWUpICE9IG51bGw7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3QgdmVyaWZ5QW5kUmV0dXJuUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gZXhpc3RzKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKGV4aXN0cykgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2plY3QgRG9lcyBOb3QgRXhpc3Q6IiArIHByb2plY3ROYW1lLCBwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9qZWN0IEV4aXN0czoiICsgcHJvamVjdE5hbWUsICFwcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGV4aXN0cykgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChleGlzdHMpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJQcm9qZWN0IERvZXMgTm90IEV4aXN0OiIgKyBwcm9qZWN0TmFtZSwgcHJvamVjdC5leGlzdHMoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvamVjdCBFeGlzdHM6IiArIHByb2plY3ROYW1lLCAhcHJvamVjdC5leGlzdHMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSBwcm9qZWN0TmFtZTsKLSAgICAgICAgaWYgKCEod29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGhTdHJpbmcpID09IG51bGwpKQotICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoU3RyaW5nKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb1Byb2plY3RzKCkgewotICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0QWxsUHJvamVjdHMoKTsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lcyA9ICIiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBwcm9qZWN0TmFtZXMgKz0gIiAiICsgcHJvamVjdHNbaV0uZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbGwgcHJvamVjdHMgbm90IGRlbGV0ZWQiICsgcHJvamVjdE5hbWVzLCBwcm9qZWN0cy5sZW5ndGggPT0gMCk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVQcm9qZWN0SWZFeGlzdHMoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LmNsb3NlKG51bGwpOwotICAgICAgICAgICAgICAgIHByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgICAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9jbG9zaW5nIHByb2plY3RzIGFuZCB0cmVhZCB3b3JrIGluIGhlcmUgaXMgYSBoYWNrIGJlY2F1c2Ugb2YgYSBCZWFuSW5mbyBidWcgaG9sZGluZwotICAgICAgICAvL29udG8gamFycyBsb2FkZWQgaW4gYW5vdGhlciBWTQotICAgICAgICAKLS8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0vLyAgICAgICAgICAgIGlmIChwcm9qZWN0c1tpXS5leGlzdHMoKSkgewotLy8gICAgICAgICAgICAgICAgcHJvamVjdHNbaV0uY2xvc2UobnVsbCk7IC8vIFRoaXMgc2hvdWxkIHNpZ25hbCB0aGUgZXh0cmEgVk0gdG8ga2lsbCBpdHNlbGYKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLSAvLyAgICAgICBUaHJlYWQueWllbGQoKTsgLy8gZ2l2ZSB0aGUgVk0gYSBjaGFuY2UgdG8gZGllCi0gICAgICAgIElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0QWxsUHJvamVjdHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCQkJCUV4Y2VwdGlvbiBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLQkJCQkJLy8gRG9uJ3QgbWFrZSAyXjEyIGlzIGFib3V0IDQgc2Vjb25kcyB3aGljaCBpcyB0aGUgbWF4IHdlCi0JCQkJCS8vIHdpbGwgd2FpdCBmb3IgdGhlIFZNIHRvIGRpZQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IDEzICYmICFzdWNjZXNzOyBqKyspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsYXN0RXhjZXB0aW9uID0gZTsKLQkJCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJcHJvamVjdC5jbG9zZShudWxsKTsKLQkJCQkJCQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKChpbnQpIE1hdGgucG93KDIsIGopKTsKLQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCX0gLy8gaWYgdGhlIFZNCi0JCQkJCQkJCQkJCQkJCQkJLy8gaXNuJ3QgZGVhZCwKLQkJCQkJCQkJCQkJCQkJCQkvLyB0cnkgc2xlZXBpbmcKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIXN1Y2Nlc3MgJiYgbGFzdEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKCJQcm9ibGVtIHdoaWxlIGRlbGV0aW5nOiAiICsgbGFzdEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotCQkJCQkJLy8gQXNzZXJ0LmZhaWwoIkNhdWdodCBFeGNlcHRpb249IiArCi0JCQkJCQkvLyBsYXN0RXhjZXB0aW9uLmdldE1lc3NhZ2UoKSArICIgd2hlbiBkZWxldGluZwotCQkJCQkJLy8gcHJvamVjdD0iICsgcHJvamVjdC5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotICAgICAgICAvL3ZlcmlmeU5vUHJvamVjdHMoKTsKLSAgICB9Ci0gICAgLyoqCi0JICogUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIFN0cmluZ3MgdG8gdGhlIGZpbGVzIGJhc2VkIG9uIHRoZSBmaWxlU3VmZml4IGFuZAotCSAqIHBhdGggd2l0aGluIHRoZSBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcGFyYW0gZmlsZVN1ZmZpeAotCSAqICAgICAgICAgICAgdGhlIGZpbGUgZW5kaW5nIHdpdGggdGhlICIuIiBpZiByZXF1aXJlZCAodGhlIHN1ZmZpeCB3aWxsIGJlCi0JICogICAgICAgICAgICB1c2VkIGFzIGlzKQotCSAqIEByZXR1cm4KLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0U3BlY2lmaWNGaWxlc0luRGlyZWN0b3J5KFBsdWdpbiBwbHVnaW4sIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgZmlsZVN1ZmZpeCkgewotICAgICAgICBVUkwgZW50cnkgPSBudWxsOyAKLSAgICAgICAgICAgIGVudHJ5ID0gcGx1Z2luLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGgpOyAKLSAgICAgICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgICAgICBGaWxlIGZvbGRlciA9IG51bGw7Ci0gICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVudHJ5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTChlbnRyeSk7Ci0gICAgICAgICAgICAgICAgZm9sZGVyID0gbmV3IEZpbGUobmV3IFVSSShlbnRyeS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3QgZmlsZXMgPSBBcnJheXMuYXNMaXN0KGZvbGRlci5saXN0KCkpOwotICAgICAgICAgICAgaWYgKCFmaWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZm9sZGVyUGF0aCA9IGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIGZpbGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlTmFtZS5lbmRzV2l0aChmaWxlU3VmZml4KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGZvbGRlclBhdGggKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRKYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIuamFyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIucmFyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIuZWFyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXYXJzSW5EaXJlY3RvcnkoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljRmlsZXNJbkRpcmVjdG9yeShwbHVnaW4sIHBhdGgsICIud2FyIik7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bGxGaWxlTmFtZShQbHVnaW4gcGx1Z2luLCBTdHJpbmcgcGx1Z2luUmVsYXRpdmVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBsdWdpblJlbGF0aXZlRmlsZU5hbWUpOwotICAgICAgICBpZiAocGF0aC5nZXREZXZpY2UoKSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHBsdWdpblJlbGF0aXZlRmlsZU5hbWU7Ci0gICAgICAgIFVSTCB1cmwgPSBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0RW50cnkocGx1Z2luUmVsYXRpdmVGaWxlTmFtZSk7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotICAgICAgICAgICAgSVBhdGggaVBhdGggPSBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIHJldHVybiBpUGF0aC50b09TU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9TaW1wbGVUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9TaW1wbGVUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlMTZlNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvU2ltcGxlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIFNpbXBsZVRlc3RTdWl0ZShDbGFzcyB0aGVDbGFzcykgewotICAgICAgICBzdXBlcih0aGVDbGFzcywgZ2V0U2hvcnROYW1lKHRoZUNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKENsYXNzIGMpewotICAgICAgICBTdHJpbmcgbmFtZSA9IGMuZ2V0TmFtZSgpOwotICAgICAgICBpZihuYW1lLmxhc3RJbmRleE9mKCcuJykgPiAwKXsKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Rhc2tWaWV3VXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1Rhc2tWaWV3VXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjEzNTVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvY29tbW9udGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi90ZXN0cy9UYXNrVmlld1V0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLgotICogVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrVmlld1V0aWxpdHkgewotCi0gICAgcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0V29ya3NwYWNlUm9vdCgpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vTmV3VGFza3MoSGFzaFNldCBoYXNoU2V0KSB7Ci0gICAgICAgIHZlcmlmeU5vTmV3VGFza3MobnVsbCwgaGFzaFNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vTmV3VGFza3MoSVJlc291cmNlIHJlc291cmNlLCBIYXNoU2V0IGhhc2hTZXQpIHsKLSAgICAgICAgdmVyaWZ5Tm9OZXdUYXNrc0ltcGwocmVzb3VyY2UsIGhhc2hTZXQsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5Tm9OZXdUYXNrc0ltcGwoSVJlc291cmNlIHJlc291cmNlLCBIYXNoU2V0IGhhc2hTZXQsIGJvb2xlYW4gZmFpbE9uRmFpbHVyZSkgewotICAgICAgICBJUmVzb3VyY2UgbWFya2VyU291cmNlID0gcmVzb3VyY2UgPT0gbnVsbCA/IGdldFdvcmtzcGFjZVJvb3QoKSA6IHJlc291cmNlOwotICAgICAgICBJTWFya2VyW10gbWFya2VycyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXJrZXJzID0gbWFya2VyU291cmNlLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBtYXJrZXJzICE9IG51bGwgJiYgaiA8IG1hcmtlcnMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbWFya2Vyc1tqXS50b1N0cmluZygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gKFN0cmluZykgbWFya2Vyc1tqXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChudWxsID09IGhhc2hTZXQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmFpbE1zZyA9ICJUYXNrIGluIFRhc2tzIExpc3Q6ICIgKyBtZXNzYWdlOwotICAgICAgICAgICAgICAgIGlmIChmYWlsT25GYWlsdXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKGZhaWxNc2cpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmYWlsTXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNoU2V0LmNvbnRhaW5zKG1hcmtlcnNbal0pKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZhaWxNc2cgPSAiTmV3IFRhc2sgaW4gVGFza3MgTGlzdDogIiArIG1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgaWYgKGZhaWxPbkZhaWx1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZmFpbE1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZhaWxNc2cpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vRXJyb3JzKCkgewotICAgICAgICB2ZXJpZnlOb0Vycm9ycyhudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9FcnJvcnMoSVJlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIExpc3QgbWFya2VycyA9IGdldEVycm9ycyhyZXNvdXJjZSk7Ci0gICAgICAgIGlmIChudWxsICE9IG1hcmtlcnMgJiYgbWFya2Vycy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IG1hcmtlcnMuc2l6ZSgpOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiIiArIHNpemUgKyAiIGVycm9ycyBpbiB0YXNrcyB2aWV3OiI7Ci0gICAgICAgICAgICBJTWFya2VyIG1hcmtlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWFya2VyID0gKElNYXJrZXIpIG1hcmtlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gIlxuIiArIGkgKyAiICIgKyAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbChtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RXJyb3JzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUmVzb3VyY2UgbWFya2VyU291cmNlID0gcmVzb3VyY2UgPT0gbnVsbCA/IGdldFdvcmtzcGFjZVJvb3QoKSA6IHJlc291cmNlOwotICAgICAgICBMaXN0IG1hcmtlcnMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFya2VycyA9IGZpbmRTZXZlcml0eU1hcmtlcnMobWFya2VyU291cmNlLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIG1hcmtlcnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBmaW5kU2V2ZXJpdHlNYXJrZXJzKElSZXNvdXJjZSBtYXJrZXJTb3VyY2UsIGludCBzZXZlcml0eUxldmVsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gbWFya2VyU291cmNlLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICAgICAgTGlzdCByZXN1bHRzID0gbnVsbDsKLSAgICAgICAgSW50ZWdlciBzZXZlcml0eTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzZXZlcml0eSA9IChJbnRlZ2VyKSBtYXJrZXJzW2ldLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLSAgICAgICAgICAgIGlmIChzZXZlcml0eS5pbnRWYWx1ZSgpID09IHNldmVyaXR5TGV2ZWwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG1hcmtlcnNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHRzID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHRzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vV2FybmluZ3MoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9UYXNrcygpIHsKLSAgICAgICAgdmVyaWZ5Tm9UYXNrcyhudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Tm9UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLSAgICAgICAgdmVyaWZ5Tm9OZXdUYXNrc0ltcGwocmVzb3VyY2UsIG51bGwsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb1Rhc2tzKGJvb2xlYW4gZmFpbE9uRmFpbHVyZSkgewotICAgICAgICB2ZXJpZnlOb1Rhc2tzKG51bGwsIGZhaWxPbkZhaWx1cmUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlOb1Rhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBmYWlsT25GYWlsdXJlKSB7Ci0gICAgICAgIHZlcmlmeU5vTmV3VGFza3NJbXBsKHJlc291cmNlLCBudWxsLCBmYWlsT25GYWlsdXJlKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUVycm9ycyhMaXN0IG1hcmtlckRlc2NyaXB0aW9uc0V4cGVjdGVkKSB7Ci0gICAgICAgIHZlcmlmeUVycm9ycyhtYXJrZXJEZXNjcmlwdGlvbnNFeHBlY3RlZCx0cnVlLGZhbHNlKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5RXJyb3JzKExpc3QgbWFya2VyRGVzY3JpcHRpb25zRXhwZWN0ZWQsIGJvb2xlYW4gcmVwb3J0SWZFeHBlY3RlZEVycm9yTm90Rm91bmQsIGJvb2xlYW4gcmVtb3ZlQWxsU2FtZVR5cGVzT2ZFcnJvcikgewotICAgICAgICBMaXN0IG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3QgbWFya2Vyc0ZvdW5kID0gZmluZFNldmVyaXR5TWFya2VycyhnZXRXb3Jrc3BhY2VSb290KCksIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotICAgICAgICAgICAgbWFya2VyRGVzY3JpcHRpb25zRm91bmQgPSBuZXcgQXJyYXlMaXN0KG1hcmtlcnNGb3VuZC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzRm91bmQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5hZGQoKChJTWFya2VyKSBtYXJrZXJzRm91bmQuZ2V0KGkpKS5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBtYXJrZXJEZXNjcmlwdGlvbnNOb3RGb3VuZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBtYXJrZXJzRGVzY3JpcHRpb25zVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyRGVzY3JpcHRpb25zRXhwZWN0ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgCVN0cmluZyBtZXNzYWdlVG9GaW5kID0gKFN0cmluZyltYXJrZXJEZXNjcmlwdGlvbnNFeHBlY3RlZC5nZXQoaSk7Ci0gICAgICAgIAlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIAlmb3IoaW50IGo9MDtqPG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLnNpemUoKSAmJighZm91bmQgfHwgcmVtb3ZlQWxsU2FtZVR5cGVzT2ZFcnJvcik7aisrKXsKLSAgICAgICAgCQlpZihtZXNzYWdlVG9GaW5kLmVxdWFscyhtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5nZXQoaikpKXsKLSAgICAgICAgCQkJZm91bmQgPSB0cnVlOwotICAgICAgICAJCQltYXJrZXJzRGVzY3JpcHRpb25zVG9SZW1vdmUuYWRkKG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLmdldChqKSk7Ci0gICAgICAgIAkJfQotICAgICAgICAgICAgfQotICAgICAgICAJaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIG1hcmtlckRlc2NyaXB0aW9uc05vdEZvdW5kLmFkZChtZXNzYWdlVG9GaW5kKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgbWFya2VyRGVzY3JpcHRpb25zRm91bmQucmVtb3ZlQWxsKG1hcmtlcnNEZXNjcmlwdGlvbnNUb1JlbW92ZSk7Ci0gICAgICAgIGlmIChtYXJrZXJEZXNjcmlwdGlvbnNOb3RGb3VuZC5zaXplKCkgPiAwIHx8IG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlcyA9ICIiOwotICAgICAgICAgICAgaWYgKHJlcG9ydElmRXhwZWN0ZWRFcnJvck5vdEZvdW5kKXsKLQkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlckRlc2NyaXB0aW9uc05vdEZvdW5kLnNpemUoKTsgaSsrKSB7Ci0JICAgICAgICAgICAgICAgIG1lc3NhZ2VzICs9ICJcbkVycm9yIG5vdCBmb3VuZDpcIiIgKyBtYXJrZXJEZXNjcmlwdGlvbnNOb3RGb3VuZC5nZXQoaSkrIlwiIjsKLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlckRlc2NyaXB0aW9uc0ZvdW5kLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZXMgKz0gIlxuVW5leHBlY3RlZCBlcnJvciBmb3VuZDpcIiIgKyBtYXJrZXJEZXNjcmlwdGlvbnNGb3VuZC5nZXQoaSkrIlwiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbWVzc2FnZXMuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbChtZXNzYWdlcyk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvV2luZG93VXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9jb21tb250ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL3Rlc3RzL1dpbmRvd1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkYzc3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2NvbW1vbnRlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vdGVzdHMvV2luZG93VXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDUsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2luZG93VXRpbGl0eSB7Ci0KLS8vICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFsbE9wZW5XaW5kb3dzKCkgewotLy8gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLS8vICAgICAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0vLwotLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotLy8gICAgICAgICAgICBmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdpbmRvd3NbaV07Ci0vLyAgICAgICAgICAgIGZpbmFsIFNoZWxsIHNoZWxsID0gd2luZG93LmdldFNoZWxsKCk7Ci0vLyAgICAgICAgICAgIHNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgU2hlbGxbXSBvdGhlclNoZWxscyA9IHNoZWxsLmdldERpc3BsYXkoKS5nZXRTaGVsbHMoKTsKLS8vICAgICAgICAgICAgICAgICAgICAvL3RoaXMgY2FuIGJlIGltcG9yb3ZlZCwgYnV0IGJhc2ljYWxseSB0aGlzIGlzIHRvIHdvcmsgb3V0IHNoZWxsIGRlcGVuZGVuY2llcy4KLS8vICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG90aGVyU2hlbGxzLmxlbmd0aDsgaisrKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RlcCB0aHJvdWdoIHNoZWxscyBiYWNrd2FyZHMgaW4gY2FzZSBvbmUgc2hlbGwgb3BlbnMgYW5vdGhlciAtLSB0aGlzIGlzIGhvdyB0aGV5IGFyZSB1c3VhbGx5IG9kZXJlZAotLy8gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gb3RoZXJTaGVsbHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAJaW50IGluZGV4ID0gKGkraikgJSBvdGhlclNoZWxscy5sZW5ndGg7IC8vIG1peCB0aGluZ3MgdXAgYSBsaXR0bGUgdG8gd29yayBvdXQgc2hlbGwgZGVwZW5kZW5jaWVzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXJTaGVsbHNbaW5kZXhdICE9IHNoZWxsICYmIG90aGVyU2hlbGxzW2luZGV4XS5pc1Zpc2libGUoKSAmJiAhb3RoZXJTaGVsbHNbaW5kZXhdLmlzRGlzcG9zZWQoKSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyU2hlbGxzW2luZGV4XS5jbG9zZSgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9KTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FY2xpcHNlU2NoZW1lVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FY2xpcHNlU2NoZW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyZmYwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRWNsaXBzZVNjaGVtZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VTY2hlbWVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lXyA9ICJUZXN0UHJvamVjdCI7Ci0gIAotICBwdWJsaWMgRWNsaXBzZVNjaGVtZVRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRWNsaXBzZVNjaGVtZVRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBFY2xpcHNlU2NoZW1lVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QodGVzdCk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHRlc3RTdWl0ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gdGhlIHdvcmtiZW5jaAotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIElQcm9qZWN0ICAgICAgIHByb2plY3QgICAgICAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoIHByb2plY3ROYW1lXyApOwotICAgIAotICAgIGlmKCBwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSApCi0gICAgewotICAgICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHRoZSBwcm9qZWN0Ci0gICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd29ya3NwYWNlUm9vdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24oIHByb2plY3ROYW1lXyApOwotICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoCi0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3QgICAgICAgcHJvamVjdCAgICAgICA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCggcHJvamVjdE5hbWVfICk7Ci0gICAgCi0gICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IGdldFRlc3QoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFY2xpcHNlU2NoZW1lVGVzdHMoIkVjbGlwc2VTY2hlbWVUZXN0cyIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QmFkVVJJcygpIAotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICJib2d1czovc29tZWZvbGRlci9zb21lZmlsZS50eHQiKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gICAKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICI6L3NvbWVmb2xkZXIvc29tZWZpbGUudHh0Iik7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm9uIHBsYXRmb3JtIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgICAgIAotIAotICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICAoU3RyaW5nKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgCi0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAoVVJMKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoIChJVVJJKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gcGxhdGZvcm0gcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgICAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgdGVzdE5ld1VSSSgpCi0gIHsKLSAgICBJVVJJU2NoZW1lICAgc2NoZW1lICAgICAgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpIDsKLSAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgCi0gICAgICBJVVJJIHVyaTEgPSBzY2hlbWUubmV3VVJJKCAicGxhdGZvcm06L3Jlc291cmNlLyIgKyBwcm9qZWN0TmFtZV8gKyAgIi9teWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTIgPSBzY2hlbWUubmV3VVJJKCAicmVsYXRpdmVkaXJlY3RvcnkvcmVsYXRpdmVmaWxlIiApOwotICAgICAgSVVSSSB1cmkzID0gc2NoZW1lLm5ld1VSSSggdXJpMSApOwotICAgICAgSVVSSSB1cmk0ID0gc2NoZW1lLm5ld1VSSSggdXJpMiApOwotICAgICAgSVVSSSB1cmk1ID0gc2NoZW1lLm5ld1VSSSggbmV3IFVSTCggdXJpMS5hc1N0cmluZygpICkgKTsgICAgIAotICAgICAgCi0gICAgICBGaWxlIGZpbGUxID0gdXJpMS5hc0ZpbGUoKTsKLSAgICAgIAotICAgICAgdXJpMS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIklzIGEgZmlsZSIsIGZpbGUxLmlzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlsZSBuYW1lcyBub3QgdGhlIHNhbWUiLCB1cmkxLmFzU3RyaW5nKCkuZXF1YWxzKCB1cmkzLnRvU3RyaW5nKCkgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlsZSBuYW1lcyBub3QgdGhlIHNhbWUiLCB1cmkyLmFzU3RyaW5nKCkuZXF1YWxzKCB1cmk0LnRvU3RyaW5nKCkgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRmlsZSBuYW1lcyBub3QgdGhlIHNhbWUiLCB1cmkxLmFzU3RyaW5nKCkuZXF1YWxzKCB1cmk1LnRvU3RyaW5nKCkgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHBsYXRmb3JtIiwgdXJpMS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHBsYXRmb3JtIiwgdXJpMy5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHBsYXRmb3JtIiwgdXJpNS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicGxhdGZvcm0iKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHJlbGF0aXZlIiwgdXJpMi5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IHJlbGF0aXZlIiwgdXJpNC5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSk7Ci0gICAgICAKLSAgICAgIHVyaTEuZXJhc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfSAgICAgCi0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2hpY2FsKCkKLSAgewotICAgIElVUklTY2hlbWUgc2NoZW1lID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKSA7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZSggIk5vdCBoaWVyYXJjaGljYWwiLCBzY2hlbWUuaXNIaWVyYXJjaGljYWwoKSA9PSB0cnVlICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RWYWxpZFVSSXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZVNjaGVtZSgpOwotICAgICAgSVVSSSAgICAgICB1cmkxICAgPSBzY2hlbWUubmV3VVJJKCAicGxhdGZvcm06L3Jlc291cmNlL3NvbWVkaXIvc29tZWZpbGUiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTIgICA9IHNjaGVtZS5uZXdVUkkoICJwbGF0Zm9ybTovcmVzb3VyY2Uvc29tZWRpciIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMyAgID0gc2NoZW1lLm5ld1VSSSggInNvbWVyZWwiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTQgICA9IHNjaGVtZS5uZXdVUkkoICJzb21lcmVsL3NvbWVtb3JlcmVsIiApOwotICAgICAgSVVSSSAgICAgICB1cmk1ICAgPSBzY2hlbWUubmV3VVJJKCAiLi9zb21lcmVsL3NvbWVtb3JlIiApOwotICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpMSApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmkyICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTMgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpNCApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmk1ICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTEgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTIgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTMgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTQgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTUgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFVSSXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBlY2xpcHNlU2NoZW1lID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAgIElVUklTY2hlbWUgZmlsZVNjaGVtZSAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIElVUkkgICAgICAgdXJpMSAgID0gZmlsZVNjaGVtZS5uZXdVUkkoICJmaWxlOi9jOi90ZW1wL3NvbWVkaXIvc29tZWZpbGUiICk7Ci0gICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIHZhbGlkIiwgIWVjbGlwc2VTY2hlbWUuaXNWYWxpZCggdXJpMSApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGhhcyBhIHZhbGlkIHN0YXR1cyIsIGVjbGlwc2VTY2hlbWUudmFsaWRhdGUoIHVyaTEgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRWNsaXBzZVVSSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRWNsaXBzZVVSSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmJkNWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0VjbGlwc2VVUklUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA2MDIxNyAgIDEyODQ1NiBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC50ZXN0czsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklTY2hlbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuVVJJRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVVSSVRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWVfID0gIlRlc3RQcm9qZWN0IjsKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRmlsZTsKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRGlyOwotICAKLSAgcHVibGljIEVjbGlwc2VVUklUZXN0cyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBydW5BbGwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWV0aG9kVG9SdW4gPSBhcmdzWzBdLnRyaW0oKTsKLSAgICAgIHJ1bk9uZShtZXRob2RUb1J1bik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEVjbGlwc2VVUklUZXN0cy5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcnVuQWxsKCkKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5PbmUoU3RyaW5nIG1ldGhvZE5hbWUpCi0gIHsKLSAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIFRlc3RDYXNlIHRlc3QgPSBuZXcgRWNsaXBzZVVSSVRlc3RzKG1ldGhvZE5hbWUpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBFY2xpcHNlVVJJVGVzdHMuIittZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIHRlbXBGaWxlICA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRtcCIsICJ0bXAiLCBudWxsICk7Ci0gICAgdGVtcERpciAgID0gbmV3IEZpbGUoIHRlbXBGaWxlLmdldFBhcmVudEZpbGUoKSwgInRtcERpciIgKTsKLSAgICB0ZW1wRGlyLm1rZGlyKCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgdGVzdCBwcm9qZWN0IGluIHRoZSB3b3JrYmVuY2gKLSAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCAgICAgICBwcm9qZWN0ICAgICAgID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KCBwcm9qZWN0TmFtZV8gKTsKLSAgICAKLSAgICBpZiggcHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgIHByb2plY3QuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgfQotICAgIAotICAgIC8vIENyZWF0ZSB0aGUgcHJvamVjdAotICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHdvcmtzcGFjZVJvb3QuZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKCBwcm9qZWN0TmFtZV8gKTsKLSAgICBwcm9qZWN0LmNyZWF0ZSggZGVzYywgbnVsbCApOwotICAgIHByb2plY3Qub3BlbiggbnVsbCApOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gdGhlIHdvcmtiZW5jaAotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIElQcm9qZWN0ICAgICAgIHByb2plY3QgICAgICAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoIHByb2plY3ROYW1lXyApOwotICAgIAotICAgIHByb2plY3QuZGVsZXRlKCB0cnVlLCBudWxsICk7Ci0gICAgdGVtcEZpbGUuZGVsZXRlKCk7Ci0gICAgZGVsZXRlRGlyKCB0ZW1wRGlyICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBnZXRUZXN0KCkKLSAgewotICAgIHJldHVybiBuZXcgRWNsaXBzZVVSSVRlc3RzKCJFY2xpcHNlVVJJVGVzdHMiKTsKLSAgfQotICBwdWJsaWMgdm9pZCB0ZXN0QXZhaWxhYmxlKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0QXZhaWxhYmxlKCkiKTsKLSAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgCi0gICAgICBJVVJJIHVyaTEgPSBmYWN0b3J5Lm5ld1VSSSggInBsYXRmb3JtOi9yZXNvdXJjZS8iICsgcHJvamVjdE5hbWVfICsgICIvbXlmaWxlIiApOwotICAgICAgSVVSSSB1cmkyID0gZmFjdG9yeS5uZXdVUkkoIGdldFRtcEZpbGVVUkwoICJzb21lZmlsZSIgKSApOwotICAgICAgSVVSSSB1cmkzID0gZmFjdG9yeS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJOb3QgYXZhaWxhYmxlIGFzIFVSTCIsIHVyaTEuaXNBdmFpbGFibGVBc1VSTCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm90IGF2YWlsYWJsZSBhcyBVUkwiLCB1cmkyLmlzQXZhaWxhYmxlQXNVUkwoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkF2YWlsYWJsZSBhcyBVUkwiLCAhdXJpMy5pc0F2YWlsYWJsZUFzVVJMKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIk5vdCBhdmFpbGFibGUgYXMgRmlsZSIsIHVyaTEuaXNBdmFpbGFibGVBc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vdCBhdmFpbGFibGUgYXMgRmlsZSIsIHVyaTIuaXNBdmFpbGFibGVBc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkF2YWlsYWJsZSBhcyBGaWxlIiwgIXVyaTMuaXNBdmFpbGFibGVBc0ZpbGUoKSApOwotICAgICAgCi0gICAgICBGaWxlIGZpbGUxID0gdXJpMS5hc0ZpbGUoKTsKLSAgICAgIEZpbGUgZmlsZTIgPSB1cmkyLmFzRmlsZSgpOwotICAgICAgVVJMICB1cmwxICA9IHVyaTEuYXNVUkwoKTsKLSAgICAgIFVSTCAgdXJsMiAgPSB1cmkyLmFzVVJMKCk7Ci0gICAgICAKLSAgICAgIHVyaTEudG91Y2hMZWFmKCk7Ci0gICAgICB1cmkyLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiSXMgYSBmaWxlIiwgZmlsZTEuaXNGaWxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJJcyBhIGZpbGUiLCBmaWxlMi5pc0ZpbGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIHByb3RvY29sIiwgdXJsMS5nZXRQcm90b2NvbCgpLmVxdWFscyggInBsYXRmb3JtIiApKTsKLSAgICAgIGFzc2VydFRydWUoICJXcm9uZyBwcm90b2NvbCIsIHVybDIuZ2V0UHJvdG9jb2woKS5lcXVhbHMoICJmaWxlIiApKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTEuYXNTdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTIuYXNTdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTEudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIGFzc2VydFRydWUoIHVyaTIudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDUgKTsKLSAgICAgIHVyaTEuZXJhc2UoKTsKLSAgICAgIHVyaTIuZXJhc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9ICAgICAgCi0gICAgICAKLSAgcHVibGljIHZvaWQgdGVzdEZhY3RvcnkoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RGYWN0b3J5KCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmYWN0b3J5Lm5ld1VSSVNjaGVtZSggbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk51bGwgVVJJIHNjaGVtZSBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgZmFjdG9yeS5uZXdVUklTY2hlbWUoICJib2d1c1Byb3RvY29sOi9zb21lZm9sZGVyL3NvbWVmaWxlLnR4dCIgKTsKLSAgICAgIGFzc2VydFRydWUoICJBbiB1bmRlZmluZWQgcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGZhY3RvcnkubmV3VVJJU2NoZW1lKCAiL3NvbWVmb2xkZXIvc29tZWZpbGUudHh0IiApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkFic29sdXRlIHBhdGggd2l0aCBubyBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUxID0gZmFjdG9yeS5uZXdVUklTY2hlbWUoICJwbGF0Zm9ybTovcmVzb3VyY2UvbXlwcm9qL215ZmlsZSIgKTsKLSAgICAgIElVUklTY2hlbWUgc2NoZW1lMiA9IGZhY3RvcnkubmV3VVJJU2NoZW1lKCBnZXRUbXBGaWxlVVJMKCAic29tZWZpbGUyIiApICk7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZTMgPSBmYWN0b3J5Lm5ld1VSSVNjaGVtZSggInBsYXRmb3JtIiApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWU0ID0gZmFjdG9yeS5uZXdVUklTY2hlbWUoICJmaWxlIiApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWU1ID0gZmFjdG9yeS5uZXdVUkkoICJyZWwxL3JlbDIiICkuZ2V0VVJJU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIElVUkkgdXJpMSA9IGZhY3RvcnkubmV3VVJJKCAicGxhdGZvcm06L3Jlc291cmNlL215cHJvai9teWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTIgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VG1wRmlsZVVSTCggInNvbWVmaWxlMyIgKSApOwotICAgICAgSVVSSSB1cmkzID0gZmFjdG9yeS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICAKLSAgICAgIElVUkkgdXJpNCA9IGZhY3RvcnkubmV3VVJJKCBuZXcgVVJMKCAicGxhdGZvcm06L3Jlc291cmNlL215cHJvai9teWZpbGUiICkpOwotICAgICAgSVVSSSB1cmk1ID0gZmFjdG9yeS5uZXdVUkkoIG5ldyBVUkwoIGdldFRtcEZpbGVVUkwoICJzb21lZmlsZTQiICkgKSApOwotICAKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlNjaGVtZSBub3QgcGxhdGZvcm0gcHJvdG9jb2wiLCBzY2hlbWUxLnRvU3RyaW5nKCkuZXF1YWxzKCJwbGF0Zm9ybSIpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBmaWxlIHByb3RvY29sIiwgc2NoZW1lMi50b1N0cmluZygpLmVxdWFscygiZmlsZSIpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBwbGF0Zm9ybSIsIHNjaGVtZTMudG9TdHJpbmcoKS5lcXVhbHMoInBsYXRmb3JtIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IGZpbGUiLCBzY2hlbWU0LnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IHJlbGF0aXZlIiwgc2NoZW1lNS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBwbGF0Zm9ybSBwcm90b2NvbCIsIHVyaTEuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoInBsYXRmb3JtIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IGZpbGUgcHJvdG9jb2wiLCB1cmkyLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IHJlbGF0aXZlIiwgdXJpMy5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygicmVsYXRpdmUiKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5vdCBwbGF0Zm9ybSBwcm90b2NvbCIsIHVyaTQuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoInBsYXRmb3JtIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJTY2hlbWUgbm90IGZpbGUgcHJvdG9jb2wiLCB1cmk1LmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFRvdWNoRm9sZGVyKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0VG91Y2hGb2xkZXIoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGggID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlciIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgyID0gZm9sZGVyUGF0aC5hcHBlbmQoICJzcGFjZSBmb2xkZXIiICk7Ci0gICAgICBJVVJJICAgdXJpICAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTIgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDIgKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJ0b3BGb2xkZXIgc2hvdWxkIG5vdCBleGlzdCIsICF1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgdXJpLnRvdWNoRm9sZGVyKCk7Ci0gICAKLSAgICAgIGFzc2VydFRydWUoICJ0b3BGb2xkZXIgc2hvdWxkIGV4aXN0IiwgdXJpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIElQYXRoIG5lc3RlZFBhdGggPSBmb2xkZXJQYXRoLmFwcGVuZCggImxldmVsMSIgKS5hcHBlbmQoICJsZXZlbDIiICk7Ci0gICAgICBJVVJJICAgbmVzdGVkdXJpICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggbmVzdGVkUGF0aCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5lc3RlZEZvbGRlciBzaG91bGQgbm90IGV4aXN0IiwgIW5lc3RlZHVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXN0ZWR1cmkudG91Y2hGb2xkZXIoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5lc3RlZEZvbGRlciBzaG91bGQgZXhpc3QiLCBuZXN0ZWR1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgSVVSSSBjaGlsZDEgPSB1cmkyLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoICJjaGlsZDEiICkgKTsKLSAgICAgIElVUkkgY2hpbGQyID0gdXJpMi5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCAiY2hpbGQyIiApICk7Ci0gICAgICAKLSAgICAgIGNoaWxkMS50b3VjaExlYWYoKTsKLSAgICAgIGNoaWxkMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSAoICJDaGlsZCAxIGluIGJsYW5rIGZvbGRlciBzaG91bGQgZXhpc3QgIiwgY2hpbGQxLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlICggIkNoaWxkIDIgaW4gYmxhbmsgZm9sZGVyIHNob3VsZCBleGlzdCAiLCBjaGlsZDIuaXNQcmVzZW50KCkgKTsKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdExpc3QoKSAKLSAgewotICAgIElFbnZpcm9ubWVudCAgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdExpc3QoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjIiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMSA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXIyIiApLmFwcGVuZCggImxlYWYxIiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVBhdGggZm9sZGVyUGF0aDIgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyMiIgKS5hcHBlbmQoICJsZWFmMiIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgzID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjIiICkuYXBwZW5kKCAibGVhZjMiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTEgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMSApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmkyICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDIgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpMyAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgzICkudG9TdHJpbmcoKSApOwotICAgICAgCi0gICAgICB1cmkxLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkyLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkzLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIElVUklbXSBiYWJpZXMgPSB1cmkwLmxpc3QoKTsKLSAgICAgICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcGF0aCBzaG91bGQgaGF2ZSAzIGNoaWxkcmVuIiwgYmFiaWVzLmxlbmd0aCA9PSAzICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nICBmb2xkZXJOYW1lID0gYmFiaWVzW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMiIgKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIGxlYWYgYmFieSB1cmk6IiArIGZvbGRlck5hbWUgKyAiLCIgKyBsZWFmTmFtZSwgT2sgKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgSVVSSVtdIGJhYmllczIgPSB1cmkwLmxpc3QoIG5ldyBJVVJJRmlsdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyggSVVSSSB1cmkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF1cmkudG9TdHJpbmcoKS5lbmRzV2l0aCggImxlYWYyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBwYXRoIHNob3VsZCBoYXZlIDIgZmlsdGVyZWQgY2hpbGRyZW4iLCBiYWJpZXMyLmxlbmd0aCA9PSAyICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMyLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgewotICAgICAgICBTdHJpbmcgIGZvbGRlck5hbWUgPSBiYWJpZXMyW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoICJXcm9uZyBsZWFmIGJhYnkgdXJpOiIgKyBmb2xkZXJOYW1lICsgIiwiICsgbGVhZk5hbWUsIE9rICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgIAotICAgIHRyeQotICAgIHsgCi0gICAgICBJUGF0aCAgICAgIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0ZXN0R2V0U2NoZW1lIiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgICAgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgICAgICAgPSB1cmkwLmdldFVSSVNjaGVtZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5hbWUgaXMgbm90IHBsYXRmb3JtIiwgc2NoZW1lLnRvU3RyaW5nKCkuZXF1YWxzKCAicGxhdGZvcm0iICkgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0QXBwZW5kKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMCAgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyMyIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDIiKTsKLSAgICAgIAotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaEZvbGRlcigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFuZXdVUkkuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgLy8gRW5zdXJlIHRoYXQgYXBwZW5kIHBhcmFtZXRlciBpcyByZWxhdGl2ZS4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJVVJJIG5ld1VSSTIgPSB1cmkwLmFwcGVuZCggdXJpMCApOyAgCi0gICAgICAgIGFzc2VydFRydWUoICJBcHBlbmRpbmcgdXNpbmcgYSBub24tcmVsYXRpdmUgc2hvdWxkIHRocm93IGFuZCBleGNlcHRpb24iLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgICAgbmV3VVJJMi5hc0ZpbGUoKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgICAKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG91Y2hMZWFmKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RUb3VjaExlYWYoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXI0IiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgZXhpc3QiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIGEgbGVhZiIsIG5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgCi0gICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gICA9IG5ld1VSSS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgaW50ICAgICAgICAgYnl0ZVJlYWQgPSAwOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYnl0ZVJlYWQgPSBzdHJlYW0ucmVhZCgpOyAvLyBSZXR1cm5zIGEgLTEgaWYgbm8gYnl0ZXMgYXJlIHJlYWQsIHdoaWNoIHNob3VsZCBiZSB0aGUgY2FzZSBoZXJlLiAKLSAgICAgIH0KLSAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgICB7Ci0gICAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVGhlcmUgc2hvdWxkIGJlIG5vIGJ5dGVzIGluIHRoaXMgc3RyZWFtIiwgIGJ5dGVSZWFkID09IC0xICk7Ci0gICAgICAKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0gICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SU9PcGVyYXRpb25zKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIE91dHB1dFN0cmVhbVdyaXRlciAgICAgICBzdHJlYW0gICAgICA9IG51bGw7Ci0gICAgUHJpbnRXcml0ZXIgICAgICAgICAgICAgIHdyaXRlciAgICAgID0gbnVsbDsKLSAgICBJbnB1dFN0cmVhbVJlYWRlciAgICAgICAgaW5wdXRTdHJlYW0gPSBudWxsOwotICAgIEJ1ZmZlcmVkUmVhZGVyICAgICAgICAgICByZWFkZXIgICAgICA9IG51bGw7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJFY2xpcHNlVVJJVGVzdHMudGVzdElPT3BlcmF0aW9ucygpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgID0gbmV3IFBhdGgoIHByb2plY3ROYW1lXyApLmFwcGVuZCggInRvcEZvbGRlcjUiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMiA9IGZhY3RvcnkubmV3VVJJKCAibGVhZkZpbGUudHh0Iik7Ci0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBiZSByZWFkYWJsZSIsICFuZXdVUkkuaXNSZWFkYWJsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBiZSB3cml0YWJsZSIsICFuZXdVUkkuaXNXcml0YWJsZSgpICk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ld1VSSS5nZXRPdXRwdXRTdHJlYW0oKSApOwotICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKCBzdHJlYW0gKTsKLSAgICAgIAotICAgICAgd3JpdGVyLnByaW50bG4oICJUaGlzIGlzIGxpbmUgMSBvZiB0aGUgZmlsZS4iICk7IAotICAgICAgd3JpdGVyLnByaW50bG4oICJUaGlzIGlzIGxpbmUgMiBvZiB0aGUgZmlsZS4iICk7Ci0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgZmlsZS4iICk7Ci0gICAgICAKLSAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICB3cml0ZXIgPSBudWxsOwotICAgICAgc3RyZWFtID0gbnVsbDsKLSAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBiZSByZWFkYWJsZSIsIG5ld1VSSS5pc1JlYWRhYmxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHdyaXRhYmxlIiwgbmV3VVJJLmlzV3JpdGFibGUoKSApOwotICAgICAgCi0gICAgICAvLyBOb3cgcmVhZCBiYWNrIHRoaXMgbmV3IGZpbGUuCi0gICAgICBpbnB1dFN0cmVhbSA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggbmV3VVJJLmdldElucHV0U3RyZWFtKCkgKTsKLSAgICAgIHJlYWRlciAgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBpbnB1dFN0cmVhbSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIGZpcnN0IGxpbmUgb2YgZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpLmVxdWFscygiVGhpcyBpcyBsaW5lIDEgb2YgdGhlIGZpbGUuIikgKTsgCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIHNlY29uZCBsaW5lIG9mIGZpbGUiLCByZWFkZXIucmVhZExpbmUoKS5lcXVhbHMoIlRoaXMgaXMgbGluZSAyIG9mIHRoZSBmaWxlLiIpICk7IAotICAgICAgYXNzZXJ0VHJ1ZSggIkJhZCBsYXN0IGxpbmUgb2YgZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpLmVxdWFscygiVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBmaWxlLiIpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXh0cmEgbGluZXMgZm91bmQgaW4gZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpID09IG51bGwgKTsKLSAgICAgIAotICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAKLSAgICAgIC8vTm93IHJlbmFtZSB0aGUgZm9sZGVyLgotICAgICAgSVVSSSBsZXZlbDEgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKTsKLSAgICAgIElVUkkgbmV3TGV2ZWwgPSB1cmkwLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoIm5ld0xldmVsMSIpICk7Ci0gICAgICBJVVJJIG9sZEZpbGUgID0gbmV3TGV2ZWwuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIElVUkkgbmV3RmlsZSAgPSBuZXdMZXZlbC5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCAibmV3RmlsZSIgKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhbmV3TGV2ZWwuYXBwZW5kKHVyaVJlbGF0aXZlMikuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbGV2ZWwxLnJlbmFtZSggbmV3TGV2ZWwgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBwcmVzZW50IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBub3QgcHJlc2VudCIsIG5ld0xldmVsLmFwcGVuZCh1cmlSZWxhdGl2ZTIpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFuZXdGaWxlLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50Iiwgb2xkRmlsZS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBvbGRGaWxlLnJlbmFtZSggbmV3RmlsZSApOwotICAgICAgICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBuZXdGaWxlLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhb2xkRmlsZS5pc1ByZXNlbnQoKSApOyAgICAgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmKCBzdHJlYW0gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKCBpbnB1dFN0cmVhbSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleGMgKQotICAgICAgICB7Ci0gICAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RSZWxhdGl2ZSgpIik7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVBhdGggZm9sZGVyUGF0aDAgICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJyZWxhdGl2ZVByb2oiICkubWFrZUFic29sdXRlKCk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGdldFVSTEZyb21QYXRoKCBmb2xkZXJQYXRoMCApLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIGxldmVsMVVSSSAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyByZWxhdGl2ZSIsICF1cmkwLmlzUmVsYXRpdmUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgcmVsYXRpdmUiLCB1cmlSZWxhdGl2ZTEuaXNSZWxhdGl2ZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIHJlbGF0aXZlIiwgIWxldmVsMVVSSS5pc1JlbGF0aXZlKCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgdXJpMC5pc0hpZXJhcmNoaWNhbCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVXJpIGlzIG5vdCBoaWVyYXJjaGljYWwiLCB1cmlSZWxhdGl2ZTEuaXNIaWVyYXJjaGljYWwoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgbGV2ZWwxVVJJLmlzSGllcmFyY2hpY2FsKCkgKTsgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RXJhc2UxKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRWNsaXBzZVVSSVRlc3RzLnRlc3RFcmFzZTEoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJ0b3BGb2xkZXI2IiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTIgPSBmYWN0b3J5Lm5ld1VSSSggImxlYWZGaWxlLnR4dCIpOwotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgSVVSSSAgIGxldmVsMVVSSSAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKTsKLSAgICAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXdVUkkudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS5lcmFzZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcm9vdCBzaG91bGQgZXhpc3QiLCB1cmkwLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIGxldmVsMSBzaG91bGQgZXhpc3QiLCBsZXZlbDFVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgdXJpMC5lcmFzZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIHJvb3Qgc2hvdWxkIG5vdCBleGlzdCIsICF1cmkwLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiZm9sZGVyIGxldmVsMSBzaG91bGQgbm90IGV4aXN0IiwgIWxldmVsMVVSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgdGVzdElzTGVhZigpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0SXNMZWFmKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBmb2xkZXJQYXRoMCAgPSBuZXcgUGF0aCggcHJvamVjdE5hbWVfICkuYXBwZW5kKCAidG9wRm9sZGVyNyIgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZ2V0VVJMRnJvbVBhdGgoIGZvbGRlclBhdGgwICkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIElVUkkgICBwYXJlbnQgICAgICAgPSBuZXdVUkkucGFyZW50KCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJwYXJlbnQgc2hvdWxkIG5vdCBleGlzdCIsICFwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBiZSBhIGxlYWYgeWV0IiwgIW5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgZXhpc3QiLCBwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIGEgbGVhZiIsIG5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VmlzaXQoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVjbGlwc2VVUklUZXN0cy50ZXN0VmlzaXQoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElQYXRoIGZvbGRlclBhdGgwICA9IG5ldyBQYXRoKCBwcm9qZWN0TmFtZV8gKS5hcHBlbmQoICJyb290IiApLm1ha2VBYnNvbHV0ZSgpOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBnZXRVUkxGcm9tUGF0aCggZm9sZGVyUGF0aDAgKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IGJ1aWxkVGVzdEVudHJpZXMoIHNjaGVtZSwgdXJpMCApOwotICAgICAgCi0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICkgKTsgICAgICAKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlRm9yVGVzdDIoIHRhYmxlICk7Ci0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlKCB0YWJsZSApOwotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApLCBuZXcgVGVzdEZpbHRlciggdGFibGUgKSApOwotICAgICAgdmVyaWZ5VGFibGUoIHRhYmxlICk7Ci0gICAgICAKLSAgICAgIHJlc2V0VGFibGVGb3JUZXN0MyggdGFibGUgKTsKLSAgICAgIHVyaTAudmlzaXQoIG5ldyBUZXN0VmlzaXRvciggdGFibGUgKSwgbmV3IFRlc3RGaWx0ZXIoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOyAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICB9Ci0gCi0gIHByaXZhdGUgY2xhc3MgVGVzdFZpc2l0b3IgaW1wbGVtZW50cyBJVVJJVmlzaXRvcgotICB7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfOwotICAgIAotICAgIHB1YmxpYyBUZXN0VmlzaXRvciggSGFzaHRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHRhYmxlXyA9IHRhYmxlOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KCBJVVJJIHVyaSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSl0YWJsZV8uZ2V0KCBnZXROYW1lKCB1cmkgKSApOwotICAgICAgZW50cnkud2FzVmlzaXRlZF8gPSB0cnVlOwotICAgICAgcmV0dXJuICFlbnRyeS5zdG9wVHJhdmVyc2luZ187Ci0gICAgfSAKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBUZXN0RmlsdGVyIGltcGxlbWVudHMgSVVSSUZpbHRlcgotICB7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgdGFibGVfOwotICAgIAotICAgIHB1YmxpYyBUZXN0RmlsdGVyKCBIYXNodGFibGUgdGFibGUpCi0gICAgewotICAgICAgdGFibGVfID0gdGFibGU7ICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyggSVVSSSB1cmkgKQotICAgIHsKLSAgICAgIE5vZGVFbnRyeSBlbnRyeSA9IChOb2RlRW50cnkpdGFibGVfLmdldCggZ2V0TmFtZSggdXJpICkgKTsKLSAgICAgIHJldHVybiBlbnRyeS52aXNpdE5vZGVfOwotICAgIH0gCi0gIH0KLSAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIGJ1aWxkVGVzdEVudHJpZXMoIElVUklTY2hlbWUgc2NoZW1lLCBJVVJJIHJvb3RVUkkgKQotICB7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIHJvb3RjMSA9IHJvb3RVUkkuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMxIikgKTsKLSAgICAgIElVUkkgcm9vdGMyID0gcm9vdFVSSS5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzIiKSApOwotICAgICAgSVVSSSByb290YzMgPSByb290VVJJLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMyIpICk7Ci0gICAgICAKLSAgICAgIElVUkkgcm9vdGMyYzEgPSByb290YzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzEiKSApOwotICAgICAgSVVSSSByb290YzJjMiA9IHJvb3RjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMiIpICk7Ci0gICAgICBJVVJJIHJvb3RjMmMzID0gcm9vdGMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMzIikgKTsKLSAgICAgIAotICAgICAgSVVSSSByb290YzJjMmMxID0gcm9vdGMyYzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzJjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjMmMyYzIgPSByb290YzJjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMmMyIikgKTsKLSAgICAgIAotICAgICAgSVVSSSByb290YzNjMSA9IHJvb3RjMy5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzNjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjM2MyID0gcm9vdGMzLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjM2MyIikgKTsKLSAgICAgIAotICAgICAgLy8gTm93IHRoYXQgdGhlIFVSSSdzIGFyZSBjcmVhdGVkIHdlIG5lZWQgdG8gY3JlYXRlIHBoeXNpY2FsIGZvbGRlcnMKLSAgICAgIC8vIGFuZCBmaWxlcyB0byByZXByZXNlbnQgdGhlbS4KLSAgICAgIHJvb3RjM2MxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMzYzIudG91Y2hMZWFmKCk7ICAgIAotICAgICAgCi0gICAgICByb290YzJjMmMxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMyYzJjMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgcm9vdGMyYzEudG91Y2hMZWFmKCk7Ci0gICAgICByb290YzJjMy50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgcm9vdGMxLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyBjcmVhdGUgdGhlIHRoZSB0YWJsZSBlbnRyaWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZpc2l0Ci0gICAgICAvLyB0aGUgVVJJIG5vZGVzLgotICAgICAgdGFibGUucHV0KCAicm9vdCIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzIiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMyIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMyIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzJjMSIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzJjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMzYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjM2MyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfSAgCi0gICAgICAKLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE5hbWUoIElVUkkgdXJpICkKLSAgeyAKLSAgICBTdHJpbmcgICAgZnVsbE5hbWUgID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgaW50ICAgICAgIHNsYXNoICAgICA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCAnLycgKTsKLSAgICBTdHJpbmcgICAgbmFtZSAgICAgID0gZnVsbE5hbWUuc3Vic3RyaW5nKCBzbGFzaCArIDEsIGZ1bGxOYW1lLmxlbmd0aCgpICk7Ci0gICAgCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2ZXJpZnlUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUoIGVudHJpZXMuaGFzTmV4dCgpICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXMubmV4dCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgICAga2V5ICA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBOb2RlRW50cnkgbm9kZSA9IChOb2RlRW50cnkpZW50cnkuZ2V0VmFsdWUoKTsgCi0gCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIHRhYmxlIHJlc3VsdCBmb3Iga2V5OiIgKyBrZXkgKyAiIHZpc2l0ZWQ9IiArIG5vZGUud2FzVmlzaXRlZF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2hvdWxkYmU9IiArIG5vZGUuc2hvdWxkQmVWaXNpdGVkXywKLSAgICAgICAgICAgICAgICAgIG5vZGUud2FzVmlzaXRlZF8gPT0gbm9kZS5zaG91bGRCZVZpc2l0ZWRfICk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZUZvclRlc3QyKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgcmVzZXRUYWJsZSggdGFibGUgKTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzIiICk7Ci0gICAgcm9vdGMyLnN0b3BUcmF2ZXJzaW5nXyA9IHRydWU7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMSIgKTsKLSAgICByb290YzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMiIgKTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMzID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMyIgKTsKLSAgICByb290YzJjMy5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzEiICk7Ci0gICAgcm9vdGMyYzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzIiICk7Ci0gICAgcm9vdGMyYzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7ICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlRm9yVGVzdDMoIEhhc2h0YWJsZSB0YWJsZSApCi0gIHsKLSAgICByZXNldFRhYmxlKCB0YWJsZSApOyAgCi0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMyA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMzIiApOwotICAgIHJvb3RjMy52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyIiApOwotICAgIHJvb3RjMmMyLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjM2MxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzNjMSIgKTsKLSAgICByb290YzNjMS52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzYzEuc2hvdWxkQmVWaXNpdGVkXyA9IGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAotICAgIHdoaWxlKCBlbnRyaWVzLmhhc05leHQoKSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSllbnRyaWVzLm5leHQoKTsKLSAgICAgIGVudHJ5Lndhc1Zpc2l0ZWRfID0gZmFsc2U7Ci0gICAgICBlbnRyeS5zaG91bGRCZVZpc2l0ZWRfPXRydWU7Ci0gICAgICBlbnRyeS5zdG9wVHJhdmVyc2luZ189ZmFsc2U7Ci0gICAgICBlbnRyeS52aXNpdE5vZGVfPXRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVUkxGcm9tUGF0aCggSVBhdGggYWJzb2x1dGVQYXRoICkKLSAgewotICAgIHJldHVybiAicGxhdGZvcm06L3Jlc291cmNlIiArIGFic29sdXRlUGF0aDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VG1wRmlsZVVSTCggU3RyaW5nIGZpbGVOYW1lICkKLSAgewotICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKCB0ZW1wRGlyLCBmaWxlTmFtZSApOyAgCi0gICAgCi0gICAgcmV0dXJuICJmaWxlOi8iICsgbmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGRlbGV0ZURpciggRmlsZSBmaWxlT3JEaXJlY3RvcnkgKQotICB7Ci0gICAgRmlsZVtdIGNoaWxkRmlsZXMgPSBmaWxlT3JEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgCi0gICAgaWYoIGNoaWxkRmlsZXMgIT0gbnVsbCApCi0gICAgewotICAgICAgLy8gRGVsZXRlIGFsbCB0aGUgY2hpbGQgZmlsZXMgb3IgZGlyZWN0b3JpZXMgZmlyc3QgYmVmb3JlIHRoaXMgb25lLgotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkRmlsZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlRGlyKCBjaGlsZEZpbGVzW2luZGV4XSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmaWxlT3JEaXJlY3RvcnkuZGVsZXRlKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgTm9kZUVudHJ5Ci0gIHsKLSAgICBwdWJsaWMgTm9kZUVudHJ5KCkKLSAgICB7Ci0gICAgICB0aGlzKCB0cnVlLCBmYWxzZSwgdHJ1ZSApOyAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vZGVFbnRyeSggYm9vbGVhbiB2aXNpdE5vZGUsIGJvb2xlYW4gc3RvcCwgYm9vbGVhbiBzaG91bGRCZVZpc2l0ZWQgKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZV8gICAgICAgPSB2aXNpdE5vZGU7Ci0gICAgICBzdG9wVHJhdmVyc2luZ18gID0gc3RvcDsKLSAgICAgIHNob3VsZEJlVmlzaXRlZF8gPSBzaG91bGRCZVZpc2l0ZWQ7Ci0gICAgICB3YXNWaXNpdGVkXyAgICAgID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0Tm9kZV87Ci0gICAgcHVibGljIGJvb2xlYW4gc3RvcFRyYXZlcnNpbmdfOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHdhc1Zpc2l0ZWRfOwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEJlVmlzaXRlZF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FbnZpcm9ubWVudFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRW52aXJvbm1lbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmU4NjQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9FbnZpcm9ubWVudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci0KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEVudmlyb25tZW50VGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgCi17CQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0JCXJldHVybiBuZXcgRW52aXJvbm1lbnRUZXN0cygpOwotCX0KLQotICBwdWJsaWMgRW52aXJvbm1lbnRUZXN0cygpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIAotICAgIGFkZFRlc3QoIEVjbGlwc2VTY2hlbWVUZXN0cy5zdWl0ZSgpICk7Ci0gICAgYWRkVGVzdCggRWNsaXBzZVVSSVRlc3RzLnN1aXRlKCkgKTsKLSAgICBhZGRUZXN0KCBGaWxlU2NoZW1lVGVzdHMuc3VpdGUoKSApOwotICAgIGFkZFRlc3QoIEZpbGVVUklUZXN0cy5zdWl0ZSgpICk7Ci0gICAgYWRkVGVzdCggU3RhdHVzSGFuZGxlclRlc3RzLnN1aXRlKCkgKTsKLSAgICBhZGRUZXN0KCBMb2dnZXJUZXN0cy5zdWl0ZSgpICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlU2NoZW1lVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlU2NoZW1lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkN2MxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRmlsZVNjaGVtZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5FbnZpcm9ubWVudFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZpbGVTY2hlbWVUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lXyA9ICJUZXN0UHJvamVjdCI7Ci0gIAotICBwdWJsaWMgRmlsZVNjaGVtZVRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoRmlsZVNjaGVtZVRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBGaWxlU2NoZW1lVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QodGVzdCk7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHRlc3RTdWl0ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSB0ZXN0IHByb2plY3QgaW4gdGhlIHdvcmtiZW5jaAotICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgIElQcm9qZWN0ICAgICAgIHByb2plY3QgICAgICAgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoIHByb2plY3ROYW1lXyApOwotICAgIAotICAgIGlmKCBwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSApCi0gICAgewotICAgICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ3JlYXRlIHRoZSBwcm9qZWN0Ci0gICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gd29ya3NwYWNlUm9vdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24oIHByb2plY3ROYW1lXyApOwotICAgIHByb2plY3QuY3JlYXRlKCBkZXNjLCBudWxsICk7Ci0gICAgcHJvamVjdC5vcGVuKCBudWxsICk7Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIHRlc3QgcHJvamVjdCBpbiB0aGUgd29ya2JlbmNoCi0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgSVByb2plY3QgICAgICAgcHJvamVjdCAgICAgICA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCggcHJvamVjdE5hbWVfICk7Ci0gICAgCi0gICAgcHJvamVjdC5kZWxldGUoIHRydWUsIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBUZXN0IGdldFRlc3QoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlU2NoZW1lVGVzdHMoIkZpbGVTY2hlbWVUZXN0cyIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QmFkVVJJcygpIAotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJIG5ld1VSSSA9IHNjaGVtZS5uZXdVUkkoICJib2d1czovc29tZWZvbGRlci9zb21lZmlsZS50eHQiKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gZmlsZSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgIAotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggIjovc29tZWZvbGRlci9zb21lZmlsZS50eHQiKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gZmlsZSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgICAgICAKLSAKLSAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAgKFN0cmluZyludWxsICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiTm9uIGZpbGUgcHJvdG9jb2wgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiIsIGZhbHNlICk7Ci0gICAgCi0gICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgIG5ld1VSSS5hc0ZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICB9ICAgCi0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSBuZXdVUkkgPSBzY2hlbWUubmV3VVJJKCAoVVJMKW51bGwgKTsKLSAgICAgIGFzc2VydFRydWUoICJOb24gZmlsZSBwcm90b2NvbCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIiwgZmFsc2UgKTsKLSAgICAKLSAgICAgIC8vIFRoaXMgY29kZSBzaG91bGQgbmV2ZXIgcnVuLgotICAgICAgbmV3VVJJLmFzRmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgIH0gIAotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElVUkkgbmV3VVJJID0gc2NoZW1lLm5ld1VSSSggKElVUkkpbnVsbCApOwotICAgICAgYXNzZXJ0VHJ1ZSggIk5vbiBmaWxlIHByb3RvY29sIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24iLCBmYWxzZSApOwotICAgIAotICAgICAgLy8gVGhpcyBjb2RlIHNob3VsZCBuZXZlciBydW4uCi0gICAgICBuZXdVUkkuYXNGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgfSAgICAgICAKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXdVUkkoKQotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RmlsZVNjaGVtZSgpIDsKLSAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgCi0gICAgICBJVVJJIHVyaTEgPSBzY2hlbWUubmV3VVJJKCAiZmlsZTovdG1wL215ZmlsZSIgKTsKLSAgICAgIElVUkkgdXJpMiA9IHNjaGVtZS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICBJVVJJIHVyaTMgPSBzY2hlbWUubmV3VVJJKCB1cmkxICk7Ci0gICAgICBJVVJJIHVyaTQgPSBzY2hlbWUubmV3VVJJKCB1cmkyICk7Ci0gICAgICBJVVJJIHVyaTUgPSBzY2hlbWUubmV3VVJJKCBuZXcgVVJMKCB1cmkxLmFzU3RyaW5nKCkgKSApOyAgICAgCi0gICAgICAKLSAgICAgIEZpbGUgZmlsZTEgPSB1cmkxLmFzRmlsZSgpOwotICAgICAgCi0gICAgICB1cmkxLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiSXMgYSBmaWxlIiwgZmlsZTEuaXNGaWxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTEuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTMudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTIuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTQudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJGaWxlIG5hbWVzIG5vdCB0aGUgc2FtZSIsIHVyaTEuYXNTdHJpbmcoKS5lcXVhbHMoIHVyaTUudG9TdHJpbmcoKSApKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgZmlsZSIsIHVyaTEuZ2V0VVJJU2NoZW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoImZpbGUiKSk7Ci0gICAgICBhc3NlcnRUcnVlKCAiUHJvdG9jb2wgbm90IGZpbGUiLCB1cmkzLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmaWxlIikpOwotICAgICAgYXNzZXJ0VHJ1ZSggIlByb3RvY29sIG5vdCBmaWxlIiwgdXJpNS5nZXRVUklTY2hlbWUoKS50b1N0cmluZygpLmVxdWFscygiZmlsZSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcmVsYXRpdmUiLCB1cmkyLmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpKTsKLSAgICAgIGFzc2VydFRydWUoICJQcm90b2NvbCBub3QgcmVsYXRpdmUiLCB1cmk0LmdldFVSSVNjaGVtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJyZWxhdGl2ZSIpKTsKLSAgICAgIAotICAgICAgdXJpMS5lcmFzZSgpOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9ICAgICAKLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgSVVSSVNjaGVtZSBzY2hlbWUgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RmlsZVNjaGVtZSgpIDsKLSAgICAKLSAgICBhc3NlcnRUcnVlKCAiTm90IGhpZXJhcmNoaWNhbCIsIHNjaGVtZS5pc0hpZXJhcmNoaWNhbCgpID09IHRydWUgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFZhbGlkVVJJcygpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJVVJJU2NoZW1lIHNjaGVtZSA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgICBJVVJJICAgICAgIHVyaTEgICA9IHNjaGVtZS5uZXdVUkkoICJmaWxlOi90bXAvc29tZWRpci9zb21lZmlsZSIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMiAgID0gc2NoZW1lLm5ld1VSSSggImZpbGU6L3RtcCIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMyAgID0gc2NoZW1lLm5ld1VSSSggInNvbWVyZWwiICk7Ci0gICAgICBJVVJJICAgICAgIHVyaTQgICA9IHNjaGVtZS5uZXdVUkkoICJzb21lcmVsL3NvbWVtb3JlcmVsIiApOwotICAgICAgSVVSSSAgICAgICB1cmk1ICAgPSBzY2hlbWUubmV3VVJJKCAiLi9zb21lcmVsL3NvbWVtb3JlIiApOwotICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpMSApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmkyICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgbm90IHZhbGlkIiwgc2NoZW1lLmlzVmFsaWQoIHVyaTMgKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBub3QgdmFsaWQiLCBzY2hlbWUuaXNWYWxpZCggdXJpNCApICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIG5vdCB2YWxpZCIsIHNjaGVtZS5pc1ZhbGlkKCB1cmk1ICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTEgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTIgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTMgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTQgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIG5vdCB2YWxpZCBzdGF0dXMiLCBzY2hlbWUudmFsaWRhdGUoIHVyaTUgKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFVSSXMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSVNjaGVtZSBlY2xpcHNlU2NoZW1lID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VTY2hlbWUoKTsKLSAgICAgIElVUklTY2hlbWUgZmlsZVNjaGVtZSAgICA9IEVudmlyb25tZW50U2VydmljZS5nZXRGaWxlU2NoZW1lKCk7Ci0gICAgICAKLSAgICAgIElVUkkgICAgICAgdXJpMSAgID0gZWNsaXBzZVNjaGVtZS5uZXdVUkkoICJwbGF0Zm9ybTovcmVzb3VyY2Uvc29tZWRpci9zb21lZmlsZSIgKTsKLSAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgdmFsaWQiLCAhZmlsZVNjaGVtZS5pc1ZhbGlkKCB1cmkxICkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaGFzIGEgdmFsaWQgc3RhdHVzIiwgZmlsZVNjaGVtZS52YWxpZGF0ZSggdXJpMSApLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlVVJJVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9GaWxlVVJJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmMDViMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvRmlsZVVSSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDYwMjE3ICAgMTI4NDU2IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC51cmkuSVVSSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnVyaS5JVVJJU2NoZW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLklVUklWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudXJpLlVSSUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZpbGVVUklUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17ICAKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRmlsZTsKLSAgcHJpdmF0ZSBGaWxlICB0ZW1wRGlyOwotICAKLSAgcHVibGljIEZpbGVVUklUZXN0cyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBydW5BbGwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWV0aG9kVG9SdW4gPSBhcmdzWzBdLnRyaW0oKTsKLSAgICAgIHJ1bk9uZShtZXRob2RUb1J1bik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEZpbGVVUklUZXN0cy5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcnVuQWxsKCkKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5PbmUoU3RyaW5nIG1ldGhvZE5hbWUpCi0gIHsKLSAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIFRlc3RDYXNlIHRlc3QgPSBuZXcgRmlsZVVSSVRlc3RzKG1ldGhvZE5hbWUpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBGaWxlVVJJVGVzdHMuIittZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOyAgCi0gICAgCi0gICAgdGVtcEZpbGUgID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgInRtcCIsIG51bGwgKTsKLSAgICB0ZW1wRGlyICAgPSBuZXcgRmlsZSggdGVtcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCAidG1wRGlyIiApOwotICAgIHRlbXBEaXIubWtkaXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICAgIAotICAgIGRlbGV0ZUZpbGVzKCB0ZW1wRGlyICk7Ci0gICAgdGVtcEZpbGUuZGVsZXRlKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBkZWxldGVGaWxlcyggRmlsZSBkaXJlY3RvcnkgKQotICB7Ci0JaWYgKGRpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQlGaWxlW10gY2hpbGRyZW4gPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0KLQkJCS8qCi0JCQkgKiBJZiAnZGlyZWN0b3J5JyBpcyBub3QgYSBkaXJlY3RvcnksIGRpcmVjdG9yeS5saXN0RmlsZXMgY2FuCi0JCQkgKiByZXR1cm4gbnVsbC4KLQkJCSAqLwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCUZpbGUgY2hpbGQgPSBjaGlsZHJlbltpbmRleF07Ci0KLQkJCQkJaWYgKGNoaWxkLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCWRlbGV0ZUZpbGVzKGNoaWxkKTsKLQkJCQkJfQotCi0JCQkJCWNoaWxkLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRUbXBGaWxlVVJMKCBTdHJpbmcgZmlsZU5hbWUgKQotICB7Ci0gICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoIHRlbXBEaXIsIGZpbGVOYW1lICk7ICAKLSAgICAKLSAgICByZXR1cm4gImZpbGU6LyIgKyBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3QgZ2V0VGVzdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVVUklUZXN0cygiRmlsZVVSSVRlc3RzIik7Ci0gIH0KLSAgcHVibGljIHZvaWQgdGVzdEF2YWlsYWJsZSgpIAotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdEF2YWlsYWJsZSgpIik7Ci0gICAgCi0gICAgdHJ5Ci0gICAgeyAgICAgIAotICAgICAgSVVSSSB1cmkyID0gZmFjdG9yeS5uZXdVUkkoIGdldFRtcEZpbGVVUkwoICJzb21lZmlsZSIgKSApOwotICAgICAgSVVSSSB1cmkzID0gZmFjdG9yeS5uZXdVUkkoICJyZWxhdGl2ZWRpcmVjdG9yeS9yZWxhdGl2ZWZpbGUiICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJOb3QgYXZhaWxhYmxlIGFzIFVSTCIsIHVyaTIuaXNBdmFpbGFibGVBc1VSTCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiQXZhaWxhYmxlIGFzIFVSTCIsICF1cmkzLmlzQXZhaWxhYmxlQXNVUkwoKSApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiTm90IGF2YWlsYWJsZSBhcyBGaWxlIiwgdXJpMi5pc0F2YWlsYWJsZUFzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiQXZhaWxhYmxlIGFzIEZpbGUiLCAhdXJpMy5pc0F2YWlsYWJsZUFzRmlsZSgpICk7Ci0gICAgICAKLSAgICAgIEZpbGUgZmlsZTIgPSB1cmkyLmFzRmlsZSgpOwotICAgICAgVVJMICB1cmwyICA9IHVyaTIuYXNVUkwoKTsKLSAgICAgIAotICAgICAgdXJpMi50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIklzIGEgZmlsZSIsIGZpbGUyLmlzRmlsZSgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiV3JvbmcgcHJvdG9jb2wiLCB1cmwyLmdldFByb3RvY29sKCkuZXF1YWxzKCAiZmlsZSIgKSk7Ci0gICAgICBhc3NlcnRUcnVlKCB1cmkyLmFzU3RyaW5nKCkubGVuZ3RoKCkgPiA1ICk7Ci0gICAgICBhc3NlcnRUcnVlKCB1cmkyLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiA1ICk7Ci0gICAgICB1cmkyLmVyYXNlKCk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgfSAgICAgIAotICAgICAgICAKLSAgcHVibGljIHZvaWQgdGVzdFRvdWNoRm9sZGVyKCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0VG91Y2hGb2xkZXIoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgIGZvbGRlclBhdGggID0gbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXIiICk7Ci0gICAgICBGaWxlICBmb2xkZXJQYXRoMiA9IG5ldyBGaWxlKCBmb2xkZXJQYXRoLCAic3BhY2UgZm9sZGVyIiApOwotICAgICAgSVVSSSAgIHVyaSAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aC50b1VSTCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmkyICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgyLnRvVVJMKCkudG9TdHJpbmcoKSAgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInRvcEZvbGRlciBzaG91bGQgbm90IGV4aXN0IiwgIXVyaS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICB1cmkudG91Y2hGb2xkZXIoKTsKLSAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInRvcEZvbGRlciBzaG91bGQgZXhpc3QiLCB1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgRmlsZSBuZXN0ZWRQYXRoID0gbmV3IEZpbGUoIG5ldyBGaWxlKCBmb2xkZXJQYXRoLCAibGV2ZWwxIiApLCAibGV2ZWwyIiApOwotICAgICAgSVVSSSBuZXN0ZWR1cmkgID0gZmFjdG9yeS5uZXdVUkkoIG5lc3RlZFBhdGgudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXN0ZWRGb2xkZXIgc2hvdWxkIG5vdCBleGlzdCIsICFuZXN0ZWR1cmkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmVzdGVkdXJpLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXN0ZWRGb2xkZXIgc2hvdWxkIGV4aXN0IiwgbmVzdGVkdXJpLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIElVUkkgY2hpbGQxID0gdXJpMi5hcHBlbmQoIGZhY3RvcnkubmV3VVJJKCAiY2hpbGQxIiApICk7Ci0gICAgICBJVVJJIGNoaWxkMiA9IHVyaTIuYXBwZW5kKCBmYWN0b3J5Lm5ld1VSSSggImNoaWxkMiIgKSApOwotICAgICAgCi0gICAgICBjaGlsZDEudG91Y2hMZWFmKCk7Ci0gICAgICBjaGlsZDIudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUgKCAiQ2hpbGQgMSBpbiBibGFuayBmb2xkZXIgc2hvdWxkIGV4aXN0ICIsIGNoaWxkMS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSAoICJDaGlsZCAyIGluIGJsYW5rIGZvbGRlciBzaG91bGQgZXhpc3QgIiwgY2hpbGQyLmlzUHJlc2VudCgpICk7Ci0gICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RMaXN0KCkgCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgIGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RMaXN0KCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIGZvbGRlclBhdGgwID0gbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXIyIiApOwotICAgICAgRmlsZSBmb2xkZXJQYXRoMSA9IG5ldyBGaWxlKCBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjIiICksICJsZWFmMSIgKTsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDIgPSBuZXcgRmlsZSggbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXIyIiApLCAibGVhZjIiICk7Ci0gICAgICBGaWxlIGZvbGRlclBhdGgzID0gbmV3IEZpbGUoIG5ldyBGaWxlKCB0ZW1wRGlyLCAidG9wRm9sZGVyMiIgKSwgImxlYWYzIiApOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTEgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgxLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTIgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgyLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaTMgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgzLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgCi0gICAgICB1cmkxLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkyLnRvdWNoRm9sZGVyKCk7Ci0gICAgICB1cmkzLnRvdWNoRm9sZGVyKCk7Ci0gICAgICAKLSAgICAgIElVUklbXSBiYWJpZXMgPSB1cmkwLmxpc3QoKTsKLSAgICAgICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcGF0aCBzaG91bGQgaGF2ZSAzIGNoaWxkcmVuIiwgYmFiaWVzLmxlbmd0aCA9PSAzICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nICBmb2xkZXJOYW1lID0gYmFiaWVzW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMiIgKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIldyb25nIGxlYWYgYmFieSB1cmk6IiArIGZvbGRlck5hbWUgKyAiLCIgKyBsZWFmTmFtZSwgT2sgKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgSVVSSVtdIGJhYmllczIgPSB1cmkwLmxpc3QoIG5ldyBJVVJJRmlsdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyggSVVSSSB1cmkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF1cmkudG9TdHJpbmcoKS5lbmRzV2l0aCggImxlYWYyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciBwYXRoIHNob3VsZCBoYXZlIDIgZmlsdGVyZWQgY2hpbGRyZW4iLCBiYWJpZXMyLmxlbmd0aCA9PSAyICk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBiYWJpZXMyLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgewotICAgICAgICBTdHJpbmcgIGZvbGRlck5hbWUgPSBiYWJpZXMyW2luZGV4XS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgIGxlYWZOYW1lICAgPSBmb2xkZXJOYW1lLnN1YnN0cmluZyggZm9sZGVyTmFtZS5sZW5ndGgoKSAtIDUsIGZvbGRlck5hbWUubGVuZ3RoKCkgKTsKLSAgICAgICAgYm9vbGVhbiBPayAgICAgICAgID0gbGVhZk5hbWUuZXF1YWxzKCAibGVhZjEiKSB8fCBsZWFmTmFtZS5lcXVhbHMoICJsZWFmMyIgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoICJXcm9uZyBsZWFmIGJhYnkgdXJpOiIgKyBmb2xkZXJOYW1lICsgIiwiICsgbGVhZk5hbWUsIE9rICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldFVSSVNjaGVtZSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgIAotICAgIHRyeQotICAgIHsgCi0gICAgICBGaWxlICAgICAgIGZvbGRlclBhdGgwICA9IG5ldyBGaWxlKCB0ZW1wRGlyLCAidGVzdEdldFNjaGVtZSIgKTsKLSAgICAgIElVUkkgICAgICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSVNjaGVtZSBzY2hlbWUgICAgICAgPSB1cmkwLmdldFVSSVNjaGVtZSgpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiU2NoZW1lIG5hbWUgaXMgbm90IGZpbGUiLCBzY2hlbWUudG9TdHJpbmcoKS5lcXVhbHMoICJmaWxlIiApICk7Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiVW5leHBlY3RlZCBleGNlcHRpb24iLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFwcGVuZCgpIAotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdEFwcGVuZCgpIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBmb2xkZXJQYXRoMCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjMiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDIiKTsKLSAgICAgIAotICAgICAgSVVSSSAgIG5ld1VSSSAgICAgICA9IHVyaTAuYXBwZW5kKCB1cmlSZWxhdGl2ZTEgKS5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaEZvbGRlcigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFuZXdVUkkuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgLy8gRW5zdXJlIHRoYXQgYXBwZW5kIHBhcmFtZXRlciBpcyByZWxhdGl2ZS4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJVVJJIG5ld1VSSTIgPSB1cmkwLmFwcGVuZCggdXJpMCApOyAgCi0gICAgICAgIGFzc2VydFRydWUoICJBcHBlbmRpbmcgdXNpbmcgYSBub24tcmVsYXRpdmUgc2hvdWxkIHRocm93IGFuZCBleGNlcHRpb24iLCB0cnVlICk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGlzIGNvZGUgc2hvdWxkIG5ldmVyIHJ1bi4KLSAgICAgICAgbmV3VVJJMi5hc0ZpbGUoKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsgICAKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG91Y2hMZWFmKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RUb3VjaExlYWYoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgICBmb2xkZXJQYXRoMCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjQiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBuZXdVUkkudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGV4aXN0IiwgbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBiZSBhIGxlYWYiLCBuZXdVUkkuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtICAgPSBuZXdVUkkuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgIGludCAgICAgICAgIGJ5dGVSZWFkID0gMDsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGJ5dGVSZWFkID0gc3RyZWFtLnJlYWQoKTsgLy8gUmV0dXJucyBhIC0xIGlmIG5vIGJ5dGVzIGFyZSByZWFkLCB3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZS4gCi0gICAgICB9Ci0gICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgICAgewotICAgICAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlRoZXJlIHNob3VsZCBiZSBubyBieXRlcyBpbiB0aGlzIHN0cmVhbSIsICBieXRlUmVhZCA9PSAtMSApOwotICAgICAgCi0gICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9ICAgICAKLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdElPT3BlcmF0aW9ucygpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgICAgICAgc3RyZWFtICAgICAgPSBudWxsOwotICAgIFByaW50V3JpdGVyICAgICAgICAgICAgICB3cml0ZXIgICAgICA9IG51bGw7Ci0gICAgSW5wdXRTdHJlYW1SZWFkZXIgICAgICAgIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgICBCdWZmZXJlZFJlYWRlciAgICAgICAgICAgcmVhZGVyICAgICAgPSBudWxsOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RJT09wZXJhdGlvbnMoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDAgICAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjUiICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGV4aXN0IiwgIW5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIiwgIW5ld1VSSS5pc1JlYWRhYmxlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHdyaXRhYmxlIiwgIW5ld1VSSS5pc1dyaXRhYmxlKCkgKTsKLSAgICAgIAotICAgICAgc3RyZWFtID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3VVJJLmdldE91dHB1dFN0cmVhbSgpICk7Ci0gICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoIHN0cmVhbSApOwotICAgICAgCi0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgbGluZSAxIG9mIHRoZSBmaWxlLiIgKTsgCi0gICAgICB3cml0ZXIucHJpbnRsbiggIlRoaXMgaXMgbGluZSAyIG9mIHRoZSBmaWxlLiIgKTsKLSAgICAgIHdyaXRlci5wcmludGxuKCAiVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBmaWxlLiIgKTsKLSAgICAgIAotICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgICBzdHJlYW0gPSBudWxsOwotICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIHJlYWRhYmxlIiwgbmV3VVJJLmlzUmVhZGFibGUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgYmUgd3JpdGFibGUiLCBuZXdVUkkuaXNXcml0YWJsZSgpICk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyByZWFkIGJhY2sgdGhpcyBuZXcgZmlsZS4KLSAgICAgIGlucHV0U3RyZWFtID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBuZXdVUkkuZ2V0SW5wdXRTdHJlYW0oKSApOwotICAgICAgcmVhZGVyICAgICAgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIGlucHV0U3RyZWFtICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgZmlyc3QgbGluZSBvZiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkuZXF1YWxzKCJUaGlzIGlzIGxpbmUgMSBvZiB0aGUgZmlsZS4iKSApOyAKLSAgICAgIGFzc2VydFRydWUoICJCYWQgc2Vjb25kIGxpbmUgb2YgZmlsZSIsIHJlYWRlci5yZWFkTGluZSgpLmVxdWFscygiVGhpcyBpcyBsaW5lIDIgb2YgdGhlIGZpbGUuIikgKTsgCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIGxhc3QgbGluZSBvZiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkuZXF1YWxzKCJUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGZpbGUuIikgKTsKLSAgICAgIGFzc2VydFRydWUoICJFeHRyYSBsaW5lcyBmb3VuZCBpbiBmaWxlIiwgcmVhZGVyLnJlYWRMaW5lKCkgPT0gbnVsbCApOwotICAgICAgCi0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgIAotICAgICAgLy9Ob3cgcmVuYW1lIHRoZSBmb2xkZXIuCi0gICAgICBJVVJJIGxldmVsMSAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApOwotICAgICAgSVVSSSBuZXdMZXZlbCA9IHVyaTAuYXBwZW5kKCBmYWN0b3J5Lm5ld1VSSSgibmV3TGV2ZWwxIikgKTsKLSAgICAgIElVUkkgb2xkRmlsZSAgPSBuZXdMZXZlbC5hcHBlbmQoIHVyaVJlbGF0aXZlMiApOwotICAgICAgSVVSSSBuZXdGaWxlICA9IG5ld0xldmVsLmFwcGVuZCggZmFjdG9yeS5uZXdVUkkoICJuZXdGaWxlIiApICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFuZXdMZXZlbC5hcHBlbmQodXJpUmVsYXRpdmUyKS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICBsZXZlbDEucmVuYW1lKCBuZXdMZXZlbCApOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIHByZXNlbnQiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICBhc3NlcnRUcnVlKCAiVVJJIGlzIG5vdCBwcmVzZW50IiwgbmV3TGV2ZWwuYXBwZW5kKHVyaVJlbGF0aXZlMikuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBwcmVzZW50IiwgIW5ld0ZpbGUuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgbm90IHByZXNlbnQiLCBvbGRGaWxlLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG9sZEZpbGUucmVuYW1lKCBuZXdGaWxlICk7Ci0gICAgICAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlVSSSBpcyBub3QgcHJlc2VudCIsIG5ld0ZpbGUuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVUkkgaXMgcHJlc2VudCIsICFvbGRGaWxlLmlzUHJlc2VudCgpICk7ICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgaWYoIHN0cmVhbSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICAgICAgewotICAgICAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYoIGlucHV0U3RyZWFtICE9IG51bGwgKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmUoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlVVJJVGVzdHMudGVzdFJlbGF0aXZlKCkiKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlICAgZm9sZGVyUGF0aDAgPSBuZXcgRmlsZSggdGVtcERpciwgInJlbGF0aXZlUHJvaiIgKTsKLSAgICAgIElVUkkgICB1cmkwICAgICAgICAgPSBmYWN0b3J5Lm5ld1VSSSggZm9sZGVyUGF0aDAudG9VUkwoKS50b1N0cmluZygpICk7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUxID0gZmFjdG9yeS5uZXdVUkkoICJsZXZlbDEiKTsKLSAgICAgIElVUkkgICBsZXZlbDFVUkkgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgcmVsYXRpdmUiLCAhdXJpMC5pc1JlbGF0aXZlKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgbm90IHJlbGF0aXZlIiwgdXJpUmVsYXRpdmUxLmlzUmVsYXRpdmUoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyByZWxhdGl2ZSIsICFsZXZlbDFVUkkuaXNSZWxhdGl2ZSgpICk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgbm90IGhpZXJhcmNoaWNhbCIsIHVyaTAuaXNIaWVyYXJjaGljYWwoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIlVyaSBpcyBub3QgaGllcmFyY2hpY2FsIiwgdXJpUmVsYXRpdmUxLmlzSGllcmFyY2hpY2FsKCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJVcmkgaXMgbm90IGhpZXJhcmNoaWNhbCIsIGxldmVsMVVSSS5pc0hpZXJhcmNoaWNhbCgpICk7IAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEVyYXNlMSgpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElVUklGYWN0b3J5ICBmYWN0b3J5ICAgICA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0RXJhc2UxKCkiKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlICAgZm9sZGVyUGF0aDAgID0gbmV3IEZpbGUoIHRlbXBEaXIsICJ0b3BGb2xkZXI2IiApOwotICAgICAgSVVSSSAgIHVyaTAgICAgICAgICA9IGZhY3RvcnkubmV3VVJJKCBmb2xkZXJQYXRoMC50b1VSTCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgIElVUkkgICB1cmlSZWxhdGl2ZTEgPSBmYWN0b3J5Lm5ld1VSSSggImxldmVsMSIpOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMiA9IGZhY3RvcnkubmV3VVJJKCAibGVhZkZpbGUudHh0Iik7Ci0gICAgICBJVVJJICAgbmV3VVJJICAgICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApLmFwcGVuZCggdXJpUmVsYXRpdmUyICk7Ci0gICAgICBJVVJJICAgbGV2ZWwxVVJJICAgID0gdXJpMC5hcHBlbmQoIHVyaVJlbGF0aXZlMSApOwotICAgICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBub3QgZXhpc3QiLCAhbmV3VVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICAgIG5ld1VSSS50b3VjaExlYWYoKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIm5ld1VSSSBzaG91bGQgZXhpc3QiLCBuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLmVyYXNlKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggImZvbGRlciByb290IHNob3VsZCBleGlzdCIsIHVyaTAuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgbGV2ZWwxIHNob3VsZCBleGlzdCIsIGxldmVsMVVSSS5pc1ByZXNlbnQoKSApOwotICAgICAgCi0gICAgICB1cmkwLmVyYXNlKCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgcm9vdCBzaG91bGQgbm90IGV4aXN0IiwgIXVyaTAuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJmb2xkZXIgbGV2ZWwxIHNob3VsZCBub3QgZXhpc3QiLCAhbGV2ZWwxVVJJLmlzUHJlc2VudCgpICk7Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMpCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SXNMZWFmKCkKLSAgewotICAgIElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCA9IEVudmlyb25tZW50U2VydmljZS5nZXRFY2xpcHNlQ29uc29sZUVudmlyb25tZW50KCk7Ci0gICAgSVVSSUZhY3RvcnkgIGZhY3RvcnkgICAgID0gZW52aXJvbm1lbnQuZ2V0VVJJRmFjdG9yeSgpOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZVVSSVRlc3RzLnRlc3RJc0xlYWYoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgICBmb2xkZXJQYXRoMCAgPSBuZXcgRmlsZSggdGVtcERpciwgInRvcEZvbGRlcjciICk7Ci0gICAgICBJVVJJICAgdXJpMCAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgSVVSSSAgIHVyaVJlbGF0aXZlMSA9IGZhY3RvcnkubmV3VVJJKCAibGV2ZWwxIik7Ci0gICAgICBJVVJJICAgdXJpUmVsYXRpdmUyID0gZmFjdG9yeS5uZXdVUkkoICJsZWFmRmlsZS50eHQiKTsKLSAgICAgIElVUkkgICBuZXdVUkkgICAgICAgPSB1cmkwLmFwcGVuZCggdXJpUmVsYXRpdmUxICkuYXBwZW5kKCB1cmlSZWxhdGl2ZTIgKTsKLSAgICAgIElVUkkgICBwYXJlbnQgICAgICAgPSBuZXdVUkkucGFyZW50KCk7Ci0gICAgICAKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBleGlzdCIsICFuZXdVUkkuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJwYXJlbnQgc2hvdWxkIG5vdCBleGlzdCIsICFwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIG5vdCBiZSBhIGxlYWYgeWV0IiwgIW5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgIAotICAgICAgbmV3VVJJLnRvdWNoTGVhZigpOwotICAgICAgCi0gICAgICBhc3NlcnRUcnVlKCAibmV3VVJJIHNob3VsZCBleGlzdCIsIG5ld1VSSS5pc1ByZXNlbnQoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgZXhpc3QiLCBwYXJlbnQuaXNQcmVzZW50KCkgKTsKLSAgICAgIGFzc2VydFRydWUoICJuZXdVUkkgc2hvdWxkIGJlIGEgbGVhZiIsIG5ld1VSSS5pc0xlYWYoKSApOwotICAgICAgYXNzZXJ0VHJ1ZSggInBhcmVudCBzaG91bGQgbm90IGJlIGEgbGVhZiIsICFwYXJlbnQuaXNMZWFmKCkgKTsKLSAgICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJFeGNlcHRpb24gdGhyb3c6IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7Ci0gICAgfQotICAgIGNhdGNoKCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAgCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VmlzaXQoKQotICB7Ci0gICAgSUVudmlyb25tZW50IGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJVVJJRmFjdG9yeSAgZmFjdG9yeSAgICAgPSBlbnZpcm9ubWVudC5nZXRVUklGYWN0b3J5KCk7Ci0gICAgSVVSSVNjaGVtZSAgIHNjaGVtZSAgICAgID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEZpbGVTY2hlbWUoKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVVUklUZXN0cy50ZXN0VmlzaXQoKSIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgZm9sZGVyUGF0aDAgPSBuZXcgRmlsZSggdGVtcERpciwgInJvb3QiICk7Ci0gICAgICBJVVJJIHVyaTAgICAgICAgID0gZmFjdG9yeS5uZXdVUkkoIGZvbGRlclBhdGgwLnRvVVJMKCkudG9TdHJpbmcoKSApOwotICAgICAgCi0gICAgICBIYXNodGFibGUgdGFibGUgPSBidWlsZFRlc3RFbnRyaWVzKCBzY2hlbWUsIHVyaTAgKTsKLSAgICAgIAotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApICk7ICAgICAgCi0gICAgICB2ZXJpZnlUYWJsZSggdGFibGUgKTsKLSAgICAgIAotICAgICAgcmVzZXRUYWJsZUZvclRlc3QyKCB0YWJsZSApOwotICAgICAgdXJpMC52aXNpdCggbmV3IFRlc3RWaXNpdG9yKCB0YWJsZSApICk7Ci0gICAgICB2ZXJpZnlUYWJsZSggdGFibGUgKTsKLSAgICAgIAotICAgICAgcmVzZXRUYWJsZSggdGFibGUgKTsKLSAgICAgIHVyaTAudmlzaXQoIG5ldyBUZXN0VmlzaXRvciggdGFibGUgKSwgbmV3IFRlc3RGaWx0ZXIoIHRhYmxlICkgKTsKLSAgICAgIHZlcmlmeVRhYmxlKCB0YWJsZSApOwotICAgICAgCi0gICAgICByZXNldFRhYmxlRm9yVGVzdDMoIHRhYmxlICk7Ci0gICAgICB1cmkwLnZpc2l0KCBuZXcgVGVzdFZpc2l0b3IoIHRhYmxlICksIG5ldyBUZXN0RmlsdGVyKCB0YWJsZSApICk7Ci0gICAgICB2ZXJpZnlUYWJsZSggdGFibGUgKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgYXNzZXJ0VHJ1ZSggIkV4Y2VwdGlvbiB0aHJvdzoiICsgZXhjLmdldE1lc3NhZ2UoKSwgZmFsc2UgKTsgIAotICAgIH0KLSAgfQotIAotICBwcml2YXRlIGNsYXNzIFRlc3RWaXNpdG9yIGltcGxlbWVudHMgSVVSSVZpc2l0b3IKLSAgewotICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhYmxlXzsKLSAgICAKLSAgICBwdWJsaWMgVGVzdFZpc2l0b3IoIEhhc2h0YWJsZSB0YWJsZSkKLSAgICB7Ci0gICAgICB0YWJsZV8gPSB0YWJsZTsgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdCggSVVSSSB1cmkgKQotICAgIHsKLSAgICAgIE5vZGVFbnRyeSBlbnRyeSA9IChOb2RlRW50cnkpdGFibGVfLmdldCggZ2V0TmFtZSggdXJpICkgKTsKLSAgICAgIGVudHJ5Lndhc1Zpc2l0ZWRfID0gdHJ1ZTsKLSAgICAgIHJldHVybiAhZW50cnkuc3RvcFRyYXZlcnNpbmdfOwotICAgIH0gCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgVGVzdEZpbHRlciBpbXBsZW1lbnRzIElVUklGaWx0ZXIKLSAgewotICAgIHByaXZhdGUgSGFzaHRhYmxlIHRhYmxlXzsKLSAgICAKLSAgICBwdWJsaWMgVGVzdEZpbHRlciggSGFzaHRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHRhYmxlXyA9IHRhYmxlOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdHMoIElVUkkgdXJpICkKLSAgICB7Ci0gICAgICBOb2RlRW50cnkgZW50cnkgPSAoTm9kZUVudHJ5KXRhYmxlXy5nZXQoIGdldE5hbWUoIHVyaSApICk7Ci0gICAgICByZXR1cm4gZW50cnkudmlzaXROb2RlXzsKLSAgICB9IAotICB9Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSBidWlsZFRlc3RFbnRyaWVzKCBJVVJJU2NoZW1lIHNjaGVtZSwgSVVSSSByb290VVJJICkKLSAgewotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVVSSSByb290YzEgPSByb290VVJJLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMSIpICk7Ci0gICAgICBJVVJJIHJvb3RjMiA9IHJvb3RVUkkuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyIikgKTsKLSAgICAgIElVUkkgcm9vdGMzID0gcm9vdFVSSS5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzMiKSApOwotICAgICAgCi0gICAgICBJVVJJIHJvb3RjMmMxID0gcm9vdGMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMxIikgKTsKLSAgICAgIElVUkkgcm9vdGMyYzIgPSByb290YzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzIiKSApOwotICAgICAgSVVSSSByb290YzJjMyA9IHJvb3RjMi5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzJjMyIpICk7Ci0gICAgICAKLSAgICAgIElVUkkgcm9vdGMyYzJjMSA9IHJvb3RjMmMyLmFwcGVuZCggc2NoZW1lLm5ld1VSSSggInJvb3RjMmMyYzEiKSApOwotICAgICAgSVVSSSByb290YzJjMmMyID0gcm9vdGMyYzIuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMyYzJjMiIpICk7Ci0gICAgICAKLSAgICAgIElVUkkgcm9vdGMzYzEgPSByb290YzMuYXBwZW5kKCBzY2hlbWUubmV3VVJJKCAicm9vdGMzYzEiKSApOwotICAgICAgSVVSSSByb290YzNjMiA9IHJvb3RjMy5hcHBlbmQoIHNjaGVtZS5uZXdVUkkoICJyb290YzNjMiIpICk7Ci0gICAgICAKLSAgICAgIC8vIE5vdyB0aGF0IHRoZSBVUkkncyBhcmUgY3JlYXRlZCB3ZSBuZWVkIHRvIGNyZWF0ZSBwaHlzaWNhbCBmb2xkZXJzCi0gICAgICAvLyBhbmQgZmlsZXMgdG8gcmVwcmVzZW50IHRoZW0uCi0gICAgICByb290YzNjMS50b3VjaExlYWYoKTsKLSAgICAgIHJvb3RjM2MyLnRvdWNoTGVhZigpOyAgICAKLSAgICAgIAotICAgICAgcm9vdGMyYzJjMS50b3VjaExlYWYoKTsKLSAgICAgIHJvb3RjMmMyYzIudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIHJvb3RjMmMxLnRvdWNoTGVhZigpOwotICAgICAgcm9vdGMyYzMudG91Y2hMZWFmKCk7Ci0gICAgICAKLSAgICAgIHJvb3RjMS50b3VjaEZvbGRlcigpOwotICAgICAgCi0gICAgICAvLyBOb3cgY3JlYXRlIHRoZSB0aGUgdGFibGUgZW50cmllcyB0aGF0IHdpbGwgYmUgdXNlZCB0byB2aXNpdAotICAgICAgLy8gdGhlIFVSSSBub2Rlcy4KLSAgICAgIHRhYmxlLnB1dCggInJvb3QiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMSIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzMiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzJjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgICAgdGFibGUucHV0KCAicm9vdGMyYzMiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMyYzEiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjMmMyYzIiLCBuZXcgTm9kZUVudHJ5KCkgKTsKLSAgICAgIHRhYmxlLnB1dCggInJvb3RjM2MxIiwgbmV3IE5vZGVFbnRyeSgpICk7Ci0gICAgICB0YWJsZS5wdXQoICJyb290YzNjMiIsIG5ldyBOb2RlRW50cnkoKSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YykKLSAgICB7Ci0gICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93OiIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOwotICAgIH0gIAotICAgICAgCi0gICAgcmV0dXJuIHRhYmxlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROYW1lKCBJVVJJIHVyaSApCi0gIHsgCi0gICAgU3RyaW5nICAgIGZ1bGxOYW1lICA9IHVyaS50b1N0cmluZygpOwotICAgIGludCAgICAgICBzbGFzaCAgICAgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZiggJy8nICk7Ci0gICAgCi0gICAgaWYoIHNsYXNoID09IC0xICkgc2xhc2ggPSBmdWxsTmFtZS5sYXN0SW5kZXhPZiggJ1xcJyApOwotICAgIAotICAgIFN0cmluZyBuYW1lID0gZnVsbE5hbWUuc3Vic3RyaW5nKCBzbGFzaCArIDEsIGZ1bGxOYW1lLmxlbmd0aCgpICk7Ci0gICAgCi0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2ZXJpZnlUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgd2hpbGUoIGVudHJpZXMuaGFzTmV4dCgpICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXMubmV4dCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgICAga2V5ICA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBOb2RlRW50cnkgbm9kZSA9IChOb2RlRW50cnkpZW50cnkuZ2V0VmFsdWUoKTsgCi0gCi0gICAgICBhc3NlcnRUcnVlKCAiQmFkIHRhYmxlIHJlc3VsdCBmb3Iga2V5OiIgKyBrZXkgKyAiIHZpc2l0ZWQ9IiArIG5vZGUud2FzVmlzaXRlZF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2hvdWxkYmU9IiArIG5vZGUuc2hvdWxkQmVWaXNpdGVkXywKLSAgICAgICAgICAgICAgICAgIG5vZGUud2FzVmlzaXRlZF8gPT0gbm9kZS5zaG91bGRCZVZpc2l0ZWRfICk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZUZvclRlc3QyKCBIYXNodGFibGUgdGFibGUgKQotICB7Ci0gICAgcmVzZXRUYWJsZSggdGFibGUgKTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzIiICk7Ci0gICAgcm9vdGMyLnN0b3BUcmF2ZXJzaW5nXyA9IHRydWU7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMSIgKTsKLSAgICByb290YzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMiIgKTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMzID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzJjMyIgKTsKLSAgICByb290YzJjMy5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzEgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzEiICk7Ci0gICAgcm9vdGMyYzJjMS5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMmMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyYzIiICk7Ci0gICAgcm9vdGMyYzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7ICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCByZXNldFRhYmxlRm9yVGVzdDMoIEhhc2h0YWJsZSB0YWJsZSApCi0gIHsKLSAgICByZXNldFRhYmxlKCB0YWJsZSApOyAgCi0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjMyA9IChOb2RlRW50cnkpdGFibGUuZ2V0KCAicm9vdGMzIiApOwotICAgIHJvb3RjMy52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzLnNob3VsZEJlVmlzaXRlZF8gPSBmYWxzZTsKLSAgICAKLSAgICBOb2RlRW50cnkgcm9vdGMyYzIgPSAoTm9kZUVudHJ5KXRhYmxlLmdldCggInJvb3RjMmMyIiApOwotICAgIHJvb3RjMmMyLnZpc2l0Tm9kZV8gPSBmYWxzZTsKLSAgICByb290YzJjMi5zaG91bGRCZVZpc2l0ZWRfID0gZmFsc2U7Ci0gICAgCi0gICAgTm9kZUVudHJ5IHJvb3RjM2MxID0gKE5vZGVFbnRyeSl0YWJsZS5nZXQoICJyb290YzNjMSIgKTsKLSAgICByb290YzNjMS52aXNpdE5vZGVfID0gZmFsc2U7Ci0gICAgcm9vdGMzYzEuc2hvdWxkQmVWaXNpdGVkXyA9IGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVzZXRUYWJsZSggSGFzaHRhYmxlIHRhYmxlICkKLSAgewotICAgIEl0ZXJhdG9yIGVudHJpZXMgPSB0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIAotICAgIHdoaWxlKCBlbnRyaWVzLmhhc05leHQoKSApCi0gICAgewotICAgICAgTm9kZUVudHJ5IGVudHJ5ID0gKE5vZGVFbnRyeSllbnRyaWVzLm5leHQoKTsKLSAgICAgIGVudHJ5Lndhc1Zpc2l0ZWRfID0gZmFsc2U7Ci0gICAgICBlbnRyeS5zaG91bGRCZVZpc2l0ZWRfPXRydWU7Ci0gICAgICBlbnRyeS5zdG9wVHJhdmVyc2luZ189ZmFsc2U7Ci0gICAgICBlbnRyeS52aXNpdE5vZGVfPXRydWU7Ci0gICAgfQotICB9Ci0gICAgCi0gIHByaXZhdGUgY2xhc3MgTm9kZUVudHJ5Ci0gIHsKLSAgICBwdWJsaWMgTm9kZUVudHJ5KCkKLSAgICB7Ci0gICAgICB0aGlzKCB0cnVlLCBmYWxzZSwgdHJ1ZSApOyAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vZGVFbnRyeSggYm9vbGVhbiB2aXNpdE5vZGUsIGJvb2xlYW4gc3RvcCwgYm9vbGVhbiBzaG91bGRCZVZpc2l0ZWQgKQotICAgIHsKLSAgICAgIHZpc2l0Tm9kZV8gICAgICAgPSB2aXNpdE5vZGU7Ci0gICAgICBzdG9wVHJhdmVyc2luZ18gID0gc3RvcDsKLSAgICAgIHNob3VsZEJlVmlzaXRlZF8gPSBzaG91bGRCZVZpc2l0ZWQ7Ci0gICAgICB3YXNWaXNpdGVkXyAgICAgID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHZpc2l0Tm9kZV87Ci0gICAgcHVibGljIGJvb2xlYW4gc3RvcFRyYXZlcnNpbmdfOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIHdhc1Zpc2l0ZWRfOwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEJlVmlzaXRlZF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9Mb2dnZXJUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0xvZ2dlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWM3NzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2Vudmlyb25tZW50L3Rlc3RzL0xvZ2dlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuRW52aXJvbm1lbnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LlN0YXR1c0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIExvZ2dlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHVibGljIExvZ2dlclRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICBydW5BbGwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT0gMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWV0aG9kVG9SdW4gPSBhcmdzWzBdLnRyaW0oKTsKLSAgICAgIHJ1bk9uZShtZXRob2RUb1J1bik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKExvZ2dlclRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBMb2dnZXJUZXN0cyhtZXRob2ROYW1lKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgTG9nZ2VyVGVzdHMuIittZXRob2ROYW1lKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCh0ZXN0KTsKLSAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5ydW4odGVzdFN1aXRlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdExvZ2dlcigpCi0gIHsKLSAgICBJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudFNlcnZpY2UuZ2V0RWNsaXBzZUNvbnNvbGVFbnZpcm9ubWVudCgpOwotICAgIElMb2cgICAgICAgICBsb2dnZXIgICAgICA9IGVudmlyb25tZW50LmdldExvZygpOwotICAgIAotCS8vYXNzZXJ0VHJ1ZSgiTG9nZ2luZyBlbmFibGVkIiwgIWxvZ2dlci5pc0VuYWJsZWQoKSk7Ci0JLy8gV2UgbWF5IG9yIG1heSBub3QgYmUgY2FsbGVkIHdpdGggdGhlIC1kZWJ1ZyBvcHRpb24sIAotCS8vIHNvIHdlIGNhbiBub3QgdGVzdCBmb3IgaXQsIGJ1dCB3ZSBjYW4gd3JpdGUgYW4gYXBwcm9wcmlhdGUgCi0JLy8gbWVzc2FnZSwgdG8gaGVscCBpbnRlcnByZXQgcmVzdWx0cywgaWYgbmVlZGVkLgotCWlmIChsb2dnZXIuaXNFbmFibGVkKCkpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgTG9nZ2luZyBpcyBlbmFibGVkIik7Ci0JfSBlbHNlIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgTG9nZ2luZyBpcyBpcyBub3QgZW5hYmxlZCIpOwkJCQotCX0KLSAgICBhc3NlcnRUcnVlKCAiTG9nZ2luZyBmZWF0dXJlIGVuYWJsZWQiLCAhbG9nZ2VyLmlzRW5hYmxlZCggImJhZCBvcHRpb24iICkgKTsKLSAgICAKLSAgICBsb2dnZXIubG9nKCBJTG9nLkVSUk9SLCAwLCB0aGlzLCAidGVzdCBsb2dnZXIiLCBTdGF0dXMuQ0FOQ0VMX1NUQVRVUyApOwotICAgIGxvZ2dlci5sb2coIElMb2cuSU5GTywgMSwgdGhpcywgImFub3RoZXIgbWV0aG9kIiwgIm9iamVjdCIgKTsKLSAgICBsb2dnZXIubG9nKCBJTG9nLldBUk5JTkcsIDMsIHRoaXMsICJvbmUgbW9yZSBtZXRob2QiLCBuZXcgU3RhdHVzRXhjZXB0aW9uKCBTdGF0dXMuT0tfU1RBVFVTICkpOwotICAgIGxvZ2dlci5sb2coIElMb2cuRVJST1IsICJvcHRpb24xIiwgMCwgdGhpcywgInRlc3QgbG9nZ2VyIiwgU3RhdHVzLkNBTkNFTF9TVEFUVVMgKTsKLSAgICBsb2dnZXIubG9nKCBJTG9nLklORk8sICJvcHRpb24yIiwgMSwgdGhpcywgImFub3RoZXIgbWV0aG9kIiwgIm9iamVjdCIgKTsKLSAgICBsb2dnZXIubG9nKCBJTG9nLldBUk5JTkcsICJvcHRpb24zIiwgMywgdGhpcywgIm9uZSBtb3JlIG1ldGhvZCIsIG5ldyBTdGF0dXNFeGNlcHRpb24oIFN0YXR1cy5PS19TVEFUVVMgKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9TdGF0dXNIYW5kbGVyVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9lbnZpcm9ubWVudC90ZXN0cy9TdGF0dXNIYW5kbGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4Yjk4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZW52aXJvbm1lbnQvdGVzdHMvU3RhdHVzSGFuZGxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LkVudmlyb25tZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50LklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgU3RhdHVzSGFuZGxlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBJU3RhdHVzIGVycm9yOwotICBwcml2YXRlIElTdGF0dXMgaW5mbzsKLSAgcHJpdmF0ZSBJU3RhdHVzIHdhcm5pbmc7Ci0gIAotICBwdWJsaWMgU3RhdHVzSGFuZGxlclRlc3RzKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gICAgCi0gICAgZXJyb3IgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJpZCIsIDAsICJlcnJvciBtZXNzYWdlIiwgbnVsbCApOwotICAgIGluZm8gICAgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLklORk8sICJpZCIsIDAsICJpbmZvIG1lc3NhZ2UiLCBudWxsICk7Ci0gICAgd2FybmluZyA9IG5ldyBTdGF0dXMoIElTdGF0dXMuV0FSTklORywgImlkIiwgMCwgIndhcm5pbmcgbWVzc2FnZSIsIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJ1bkFsbCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAxKQotICAgIHsKLSAgICAgIFN0cmluZyBtZXRob2RUb1J1biA9IGFyZ3NbMF0udHJpbSgpOwotICAgICAgcnVuT25lKG1ldGhvZFRvUnVuKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RhdHVzSGFuZGxlclRlc3RzLmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBydW5BbGwoKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bk9uZShTdHJpbmcgbWV0aG9kTmFtZSkKLSAgewotICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgVGVzdENhc2UgdGVzdCA9IG5ldyBTdGF0dXNIYW5kbGVyVGVzdHMobWV0aG9kTmFtZSk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIFN0YXR1c0hhbmRsZXJUZXN0cy4iK21ldGhvZE5hbWUpOwotICAgIHRlc3RTdWl0ZS5hZGRUZXN0KHRlc3QpOwotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bih0ZXN0U3VpdGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RW52aXJvbm1lbnRTdGF0dXNIYW5kbGVyKCkKLSAgewotICAgIElFbnZpcm9ubWVudCAgIGVudmlyb25tZW50ID0gRW52aXJvbm1lbnRTZXJ2aWNlLmdldEVjbGlwc2VDb25zb2xlRW52aXJvbm1lbnQoKTsKLSAgICBJU3RhdHVzSGFuZGxlciBoYW5kbGVyICAgICA9IGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDaG9pY2UgY2hvaWNlMSA9IG5ldyBDaG9pY2UoKTsKLSAgICAgIENob2ljZSBjaG9pY2UyID0gbmV3IENob2ljZSggJ28nLCAiT2siLCAiZGVzY3JpcHRpb24iICk7Ci0gICAgICAKLSAgICAgIFN0YXR1c0V4Y2VwdGlvbiBzb21lRXhjZXB0aW9uID0gbmV3IFN0YXR1c0V4Y2VwdGlvbiggZXJyb3IgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggIlN0YXR1cyBub3QgdGhlIHNhbWUgIiwgc29tZUV4Y2VwdGlvbi5nZXRTdGF0dXMoKSA9PSBlcnJvciApOwotICAgICAgCi0gICAgICBoYW5kbGVyLnJlcG9ydCggU3RhdHVzLk9LX1NUQVRVUyApOwotICAgICAgaGFuZGxlci5yZXBvcnQoIGVycm9yICk7Ci0gICAgICBoYW5kbGVyLnJlcG9ydCggd2FybmluZyApOwotICAgICAgaGFuZGxlci5yZXBvcnQoIGluZm8gKTsKLSAgICAgIGNob2ljZTEuc2V0U2hvcnRjdXQoICdjJyApOwotICAgICAgY2hvaWNlMS5zZXRMYWJlbCggImNhbmNlbCIgKTsKLSAgICAgIGNob2ljZTEuc2V0RGVzY3JpcHRpb24oICJjYW5jZWwgZGVzY3JpcHRpb24iICk7Ci0gICAgICAKLSAgICAgIENob2ljZSByZXN1bHQgPSBoYW5kbGVyLnJlcG9ydCggZXJyb3IsIG51bGwgKTsKLSAgICAgIAotICAgICAgYXNzZXJ0VHJ1ZSggInJlc3VsdCBub3QgbnVsbCAiLCByZXN1bHQgPT0gbnVsbCApOwotICAgICAgCi0gICAgICByZXN1bHQgPSBoYW5kbGVyLnJlcG9ydCggZXJyb3IsIG5ldyBDaG9pY2VbMF0gKTsKLSAgICAgIGFzc2VydFRydWUoICJyZXN1bHQgbm90IG51bGwgIiwgcmVzdWx0ID09IG51bGwgKTsKLSAgICAgIAotICAgICAgcmVzdWx0ID0gaGFuZGxlci5yZXBvcnQoIGVycm9yLCBuZXcgQ2hvaWNlW117IGNob2ljZTIsIGNob2ljZTEgfSApOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpcnN0IGNob2ljZSBzaG9ydGN1dCBub3QgdGhlIHNhbWUiLCByZXN1bHQuZ2V0U2hvcnRjdXQoKSA9PSBjaG9pY2UyLmdldFNob3J0Y3V0KCkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpcnN0IGNob2ljZSBsYWJlbCBub3QgdGhlIHNhbWUiLCByZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoIGNob2ljZTIuZ2V0TGFiZWwoKSkpOwotICAgICAgYXNzZXJ0VHJ1ZSggIkZpcnN0IGNob2ljZSBkZXNjcmlwdGlvbiBub3QgdGhlIHNhbWUiLCByZXN1bHQuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoIGNob2ljZTIuZ2V0RGVzY3JpcHRpb24oKSkpOwotICAgICAgCi0gICAgICBoYW5kbGVyLnJlcG9ydEVycm9yKCBlcnJvciApOwotICAgICAgaGFuZGxlci5yZXBvcnRJbmZvKCBpbmZvICk7Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2goIFN0YXR1c0V4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIGFzc2VydFRydWUoICJ1bmV4cGVjdGVkIGV4Y2VwdGlvbjoiLCBmYWxzZSApOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvYXJ0aWZhY3RlZGl0L3Rlc3RzL0FydGlmYWN0RWRpdEFQSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9hcnRpZmFjdGVkaXQvdGVzdHMvQXJ0aWZhY3RFZGl0QVBJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1MDYzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9hcnRpZmFjdGVkaXQvdGVzdHMvQXJ0aWZhY3RFZGl0QVBJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFydGlmYWN0ZWRpdC50ZXN0czsKLQotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RFZGl0QVBJVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXRBUElUZXN0cygpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRBUElUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJLy9hZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoQXJ0aWZhY3RFZGl0VGVzdC5jbGFzcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvYXJ0aWZhY3RlZGl0L3Rlc3RzL0FydGlmYWN0RWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2FydGlmYWN0ZWRpdC90ZXN0cy9BcnRpZmFjdEVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzkxMTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvYXJ0aWZhY3RlZGl0L3Rlc3RzL0FydGlmYWN0RWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5hcnRpZmFjdGVkaXQudGVzdHM7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmV0b29scy5jb21tb24udGVzdC5hcGl0b29scy5Qcm9qZWN0VW56aXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi0KLQotcHVibGljIGNsYXNzIEFydGlmYWN0RWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEFydGlmYWN0RWRpdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYk1vZHVsZTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRCA9ICJqc3Qud2ViIjsKLQlwcml2YXRlIEFydGlmYWN0RWRpdE1vZGVsIGFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZDsKLQlwcml2YXRlIEFydGlmYWN0RWRpdE1vZGVsIGFydGlmYWN0RWRpdE1vZGVsRm9yV3JpdGU7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0Rm9yUmVhZDsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXRGb3JXcml0ZTsKLQlwcml2YXRlIEVkaXRNb2RlbExpc3RlbmVyIGVtTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiVGVzdEFydGlmYWN0RWRpdC56aXAiKTsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQotCi0JcHJpdmF0ZSBJT3BlcmF0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IElPcGVyYXRpb25IYW5kbGVyKCkgewotCi0KLQkJcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0KLQkJcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2soU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCi0KLQkJfQotCi0KLQkJcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0VGVzdCgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghZ2V0VGFyZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJaWYgKCFjcmVhdGVQcm9qZWN0KCkpCi0JCQkJZmFpbCgpOwotCQlwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCX0KLQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0KCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBuZXcgU3RyaW5nW117UFJPSkVDVF9OQU1FfSk7Ci0JCXJldHVybiB1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCi0KLQotCXByaXZhdGUgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCi0JCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiKTsKLQkJVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotCi0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHVybC50b1N0cmluZygpICsgemlwRmlsZVBhdGgpOwotCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQkJcHJpbnRMb2NhbFBhdGgodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotCi0KLQotCXByaXZhdGUgdm9pZCBwcmludExvY2FsUGF0aChVUkwgdXJsKSB7Ci0JCUlQYXRoIHBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGguYXBwZW5kKCJQbGF0Zm9ybUluZm8udHh0IikudG9PU1N0cmluZygpKTsKLQkJQnVmZmVyZWRXcml0ZXIgYnc7Ci0JCVN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQkJU3RyaW5nIGZpbGVTZXBlcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7Ci0JCVVSTCB1cmxGaW5kVXNpbmdQbHVnaW4gPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybEZpbmRVc2luZ1BsdWdpbiA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsRmluZFVzaW5nUGx1Z2luKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCVN0cmluZyBqYXZhRmlsZVNlcGVyYXRvciA9IG5ldyBDaGFyYWN0ZXIoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcikudG9TdHJpbmcoKTsKLQotCi0JCXRyeSB7Ci0JCQlidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7Ci0JCQlidy53cml0ZSgicGx1Z2luRGVzY3JpcHRvciBVUkwgIiArIHVybC50b1N0cmluZygpKTsKLQkJCWJ3LndyaXRlKCJcbiIpOwotCQkJYncud3JpdGUoIk9wZXJhdGluZyBTeXN0ZW06ICIgKyBvc05hbWUpOwotCQkJYncud3JpdGUoIlxuIik7Ci0JCQlidy53cml0ZSgiU3lzdGVtIGZpbGUgc2VwZXJhdG9yOiAiICsgZmlsZVNlcGVyYXRvcik7Ci0JCQlidy53cml0ZSgiXG4iKTsKLQkJCWJ3LndyaXRlKCJVc2luZyBQbHVpZ24uZmluZCBVUkw6IiArIHVybEZpbmRVc2luZ1BsdWdpbi50b1N0cmluZygpKTsKLQkJCWJ3LndyaXRlKCJcbiIpOwotCQkJYncud3JpdGUoIkphdmEgZmlsZSBzZXBlcmF0b3I6ICIgKyBqYXZhRmlsZVNlcGVyYXRvcik7Ci0JCQlidy53cml0ZSgiXG4iKTsKLQkJCWJ3LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCi0JfQotCi0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdEVkaXRGb3JSZWFkV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGVXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFydGlmYWN0RWRpdEZvclJlYWRDb21wb25lbnRIYW5kbGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGVDb21wb25lbnRIYW5kbGUoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZEVkaXRhYmxlTW9kdWxlKCkgewotCQlhc3NlcnRUcnVlKEFydGlmYWN0RWRpdC5pc1ZhbGlkRWRpdGFibGVNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJ0aWZhY3RFZGl0QXJ0aWZhY3RFZGl0TW9kZWwoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbmV3IEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoZWRpdCk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEFydGlmYWN0RWRpdE1vZHVsZUNvcmVOYXR1cmVXb3JrYmVuY2hDb21wb25lbnRib29sZWFuKCkgewotCQl0cnkgewotCQkJU3RydWN0dXJlRWRpdC5nZXRNb2R1bGVDb3JlTmF0dXJlKG1vZHVsZVVSSSk7Ci0JCX0gIGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gbmV3IEFydGlmYWN0RWRpdChwcm9qZWN0LCB0cnVlKTsKLQkJCWFzc2VydE5vdE51bGwoZWRpdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmUoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWVkaXQuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUlmTmVjZXNzYXJ5KCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJdHJ5IHsKLQkJCQllZGl0LnNhdmVJZk5lY2Vzc2FyeShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoKSB7Ci0JCUFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWVkaXQuc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBoYW5kbGVyLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlwYXNzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQ7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gbmV3IEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JCQllZGl0LmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudE1vZGVsUm9vdCgpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFydGlmYWN0RWRpdC5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotCQkJLy8gYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0ZW5lcigpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCXRyeSB7Ci0JCQllZGl0LmFkZExpc3RlbmVyKGdldEVtTGlzdGVuZXIoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMaXN0ZW5lcigpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCXRyeSB7Ci0JCQllZGl0LnJlbW92ZUxpc3RlbmVyKGdldEVtTGlzdGVuZXIoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0VkaXRNb2RlbCgpIHsKLQotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJYXNzZXJ0VHJ1ZShlZGl0Lmhhc0VkaXRNb2RlbChhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQpKTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFydGlmYWN0RWRpdE1vZGVsKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJYXNzZXJ0VHJ1ZShlZGl0Lmhhc0VkaXRNb2RlbChhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQpKTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdCgpIHsKLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzcygpIHsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCWFzc2VydE5vdE51bGwoZWRpdC5nZXRDbGFzcygpKTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJaW50IHkgPSAtOTk5OTk5OTk5OwotCQlpbnQgeCA9IGVkaXQuaGFzaENvZGUoKTsKLQkJYXNzZXJ0VHJ1ZSh4ICE9IHkpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlhc3NlcnRUcnVlKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKS5lcXVhbHMoYXJ0aWZhY3RFZGl0Rm9yUmVhZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkudG9TdHJpbmcoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90aWZ5KCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkpIHsKLQkJCQlhcnRpZmFjdEVkaXRGb3JSZWFkLm5vdGlmeSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcGFzcygpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdGlmeUFsbCgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpKSB7Ci0JCQkJYXJ0aWZhY3RFZGl0Rm9yUmVhZC5ub3RpZnlBbGwoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdGxvbmcoKSB7Ci0JCWxvbmcgeCA9IDI7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWdldEFydGlmYWN0RWRpdEZvclJlYWQoKS53YWl0KHgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcGFzcygpOwotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCB3YWl0KGxvbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdGxvbmdpbnQoKSB7Ci0JCWludCB4ID0gMjsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpKSB7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLndhaXQoeCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXQoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWdldEFydGlmYWN0RWRpdEZvclJlYWQoKS53YWl0KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmFsaXplKCkgewotCQlwYXNzKCk7Ci0JfQotCi0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dChwcm9qZWN0KTsKLQkJYXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkID0gbmV3IEFydGlmYWN0RWRpdE1vZGVsKEVESVRfTU9ERUxfSUQsIGNvbnRleHQsIHRydWUsIG1vZHVsZVVSSSk7Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQ7Ci0JfQotCi0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJYXJ0aWZhY3RFZGl0Rm9yUmVhZCA9IG5ldyBBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0Rm9yUmVhZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYXNzKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWxMaXN0ZW5lciBnZXRFbUxpc3RlbmVyKCkgewotCQlpZiAoZW1MaXN0ZW5lciA9PSBudWxsKQotCQkJZW1MaXN0ZW5lciA9IG5ldyBFZGl0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCQl9Ci0JCQl9OwotCQlyZXR1cm4gZW1MaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZSgpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHQocHJvamVjdCk7Ci0JCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0TW9kZWwoRURJVF9NT0RFTF9JRCwgY29udGV4dCwgZmFsc2UsIG1vZHVsZVVSSSk7Ci0KLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvcldyaXRlKCkgewotCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKCkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODYwM2ZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0JCQotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7IAotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElWaXJ0dWFsRm9sZGVyQVBJVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNb2R1bGVDb3JlQVBJRlZUVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QuY2xhc3MpOwotCQkvL3N1aXRlLmFkZFRlc3RTdWl0ZShTdHJ1Y3R1cmVFZGl0QVBJVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5jbGFzcyk7Ci0JCQotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQmFzZVZpcnR1YWxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0Jhc2VWaXJ0dWFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDBjYjZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQmFzZVZpcnR1YWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHMuVGVzdFdvcmtzcGFjZTsKLQotcHVibGljIGNsYXNzIEJhc2VWaXJ0dWFsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3QgVEVTVF9QUk9KRUNUID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuUFJPSkVDVF9OQU1FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRk9MREVSX05BTUUgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEggPSBuZXcgUGF0aCgiL1dlYk1vZHVsZTEvV2ViQ29udGVudC8iK1RFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiLyIrVEVTVF9GT0xERVJfTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggVEVTVERBVEFfRk9MREVSX1JFQUxfUEFUSCA9IG5ldyBQYXRoKCJXZWJNb2R1bGUxL3Rlc3RkYXRhIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aCBURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggREVMRVRFTUVfUEFUSCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCi0JcHJvdGVjdGVkIElWaXJ0dWFsRm9sZGVyIHdlYkluZkZvbGRlcjsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciByZWFsV2ViSW5mRm9sZGVyOwotCQotCXByb3RlY3RlZCBJVmlydHVhbEZvbGRlciBkZWxldGVtZVZpcnR1YWxGb2xkZXI7Ci0JcHJvdGVjdGVkIElDb250YWluZXIgZGVsZXRlbWVGb2xkZXI7CQotCi0JcHJvdGVjdGVkIElWaXJ0dWFsRm9sZGVyIHRlc3RkYXRhRm9sZGVyOwotCXByb3RlY3RlZCBJQ29udGFpbmVyIHJlYWxUZXN0ZGF0YUZvbGRlcjsKLQkKLQkKLQotCXB1YmxpYyBCYXNlVmlydHVhbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfSAKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlpZiAoIVRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJaWYgKCFUZXN0V29ya3NwYWNlLmNyZWF0ZVByb2plY3QoKSkKLQkJCQlmYWlsKCk7Ci0KLQkJCi0JCXJlYWxXZWJJbmZGb2xkZXIgPSBURVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFdFQklORl9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JCWNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KFRFU1RfUFJPSkVDVCk7Ci0JCQotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCi0JCXdlYkluZkZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIKTsgCQkKLQotCQl0ZXN0ZGF0YUZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SVU5USU1FX1BBVEgpOyAKLQkJcmVhbFRlc3RkYXRhRm9sZGVyID0gVEVTVF9QUk9KRUNULmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKERFTEVURU1FX1BBVEgpOwotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJZGVsZXRlbWVGb2xkZXIgPSBkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwkJCi0JCQotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlpZihkZWxldGVtZUZvbGRlci5leGlzdHMoKSkKLQkJCWRlbGV0ZW1lRm9sZGVyLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Db21wb25lbnRDb3JlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Db21wb25lbnRDb3JlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWExY2M1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvQ29tcG9uZW50Q29yZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHMuUHJvamVjdFVuemlwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50Q29yZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEFydGlmYWN0RWRpdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYk1vZHVsZTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRCA9ICJqc3Qud2ViIjsKLQlwcml2YXRlIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiVGVzdERhdGEiICsgZmlsZVNlcCArICJUZXN0QXJ0aWZhY3RFZGl0LnppcCIpOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIGludCBpLCBzZWVkID0gMDsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghZ2V0VGFyZ2V0UHJvamVjdCgpLmV4aXN0cygpKQotCQkJaWYgKCFjcmVhdGVQcm9qZWN0KCkpCi0JCQkJZmFpbCgpOwotCQlwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCX0KLQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0KCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBuZXcgU3RyaW5nW117UFJPSkVDVF9OQU1FfSk7Ci0JCXJldHVybiB1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRMb2NhbFBhdGgoKSB7Ci0JCVVSTCB1cmwgPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29tcG9uZW50KCkgewotCQl0cnkgewotCQkJbmV3IENvbXBvbmVudENvcmUoKTsKLQkJCUNvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsICJ0ZXN0Iik7Ci0JCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb21wb25lbnRVc2luZ0NyZWF0ZSgpIHsKLQkJCi0JCUpvYltdIGNyZWF0ZUNvbXBvbmVudEpvYiA9IG5ldyBKb2JbNTAwXTsKLQkJZm9yICggIGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKLQkJCQotCQkgY3JlYXRlQ29tcG9uZW50Sm9iW2ldID0gbmV3IEpvYigiQ3JlYXRlQ29tcG9uZW50IFRlc3QiKSB7Ci0JCSAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkgICAgICAgIAl0cnkgewotCQkgICAgCQkJSVZpcnR1YWxDb21wb25lbnQgYwotCQkgICAgICAgICAgICAgICAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCggcHJvamVjdCwgcHJvamVjdC5nZXROYW1lKCkgKyBnZXROZXh0U2VlZCgpICk7Ci0JCSAgICAJCQljLmNyZWF0ZSggMCwgbnVsbCApOwotCQkgICAgCQkKLQkJICAgIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICAgIAkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJICAgIAkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJICAgIAkJfQotCQkgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJICAgICAgICB9Ci0JCSAgICB9OwotCQl9Ci0JCWZvciAoaW50IG4gPSAwOyBuIDwgY3JlYXRlQ29tcG9uZW50Sm9iLmxlbmd0aDsgbisrKSB7Ci0JCQljcmVhdGVDb21wb25lbnRKb2Jbbl0uc2V0UnVsZShwcm9qZWN0KTsKLQkJCWNyZWF0ZUNvbXBvbmVudEpvYltuXS5zY2hlZHVsZSgpOwotCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0TmV4dFNlZWQoKSB7Ci0JCXJldHVybiBzZWVkKys7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRm9sZGVyKCkgewotCQl0cnkgewotCQkJQ29tcG9uZW50Q29yZS5jcmVhdGVGb2xkZXIocHJvamVjdCwgbmV3IFBhdGgoInRlc3QvcnVudGltZVBhdGgiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRmlsZSgpIHsKLQkJdHJ5IHsKLQkJCUNvbXBvbmVudENvcmUuY3JlYXRlRmlsZShwcm9qZWN0LCBuZXcgUGF0aCgidGVzdC9ydW50aW1lUGF0aC9maWxlIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVJlZmVyZW5jZSgpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29udGFpbmVyID0gbmV3IFZpcnR1YWxDb21wb25lbnQocHJvamVjdCwgbmV3IFBhdGgoInRlc3QvcnVudGltZVBhdGgvZmlsZSIpKTsKLQkJCi0JCXRyeSB7Ci0JCQlDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZShjb250YWluZXIsY29udGFpbmVyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUmVzb3VyY2VzKCkgewotCQlJUmVzb3VyY2UgcmVzID0gcHJvamVjdC5nZXRGaWxlKG5ldyBQYXRoKCJXZWJNb2R1bGUxL1dlYkNvbnRlbnQvV0VCLUlORi93ZWIueG1sIikpOwotCQkKLQkJdHJ5IHsKLQkJCUNvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSUVkaXRNb2RlbEhhbmRsZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lFZGl0TW9kZWxIYW5kbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjUzMjU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSUVkaXRNb2RlbEhhbmRsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLklFZGl0TW9kZWxIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgSUVkaXRNb2RlbEhhbmRsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBjbGFzcyBFZGl0TW9kZWxIYW5kbGVyVGVzdCBpbXBsZW1lbnRzIElFZGl0TW9kZWxIYW5kbGVyIHsKLQkJcHVibGljIEVkaXRNb2RlbEhhbmRsZXJUZXN0KCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2F2ZShJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzYXZlSWZOZWNlc3NhcnkoSVByb2dyZXNzTW9uaXRvciBhTW9uaXRvcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlKCkgewotCQlJRWRpdE1vZGVsSGFuZGxlciBoYW5kbGVyID0gbmV3IEVkaXRNb2RlbEhhbmRsZXJUZXN0KCk7Ci0JCWhhbmRsZXIuc2F2ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUlmTmVjZXNzYXJ5KCkgewotCQlJRWRpdE1vZGVsSGFuZGxlciBoYW5kbGVyID0gbmV3IEVkaXRNb2RlbEhhbmRsZXJUZXN0KCk7Ci0JCWhhbmRsZXIuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHsKLQkJSUVkaXRNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG5ldyBFZGl0TW9kZWxIYW5kbGVyVGVzdCgpOwotCQloYW5kbGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FkOTYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbENvbXBvbmVudEFQSVRlc3QgZXh0ZW5kcyBCYXNlVmlydHVhbFRlc3QgewotCi0JcHVibGljIElWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRUeXBlSWQoKSB7Ci0vLwkJU3RyaW5nIGlkID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpIDsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcG9uZW50VHlwZUlkKCkgewotLy8JCVN0cmluZyBpZCA9ICJqc3QuZWpiIjsKLS8vCQljb21wb25lbnQuc2V0Q29tcG9uZW50VHlwZUlkKGlkKSA7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0YVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IGNvbXBvbmVudC5nZXRNZXRhUHJvcGVydGllcygpIDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0YVJlc291cmNlcygpIHsKLQkJSVBhdGhbXSBtZXRhcmVzb3VyY2VzID0gY29tcG9uZW50LmdldE1ldGFSZXNvdXJjZXMoKSA7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0YVJlc291cmNlcygpIHsKLQkJCi0JCUlQYXRoW10gbWV0YXJlc291cmNlcyA9IG5ldyBJUGF0aFsxXTsKLQkJbWV0YXJlc291cmNlc1swXSA9IG5ldyBQYXRoKCIvdGVzdCIpOwotCQljb21wb25lbnQuc2V0TWV0YVJlc291cmNlcyhtZXRhcmVzb3VyY2VzKSA7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlcygpIHsKLQkJU3RyaW5nIHJlc291cmNlID0gIi90ZXN0IjsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7CQkKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZSA9IHJvb3RGb2xkZXIuZ2V0UmVzb3VyY2VzKHJlc291cmNlKSA7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgIHRlc3RFeGlzdHMoKXsKLQkJYm9vbGVhbiBleGlzdHMgPSBjb21wb25lbnQuZXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb290Rm9sZGVyKCl7Ci0JCWNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0KCl7Ci0JCWNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRNZXRhUHJvcGVydHkoKXsKLQkJY29tcG9uZW50LnNldE1ldGFQcm9wZXJ0eSgiVGVzdDEiLCAidGVzdDFWYWx1ZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0aWVzKCl7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlwcm9wcy5zZXRQcm9wZXJ0eSgiVGVzdDIiLCAiVmFsdWUyIik7Ci0JCWNvbXBvbmVudC5zZXRNZXRhUHJvcGVydGllcyhwcm9wcyk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbENvbnRhaW5lclRlc3RBUEkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxDb250YWluZXJUZXN0QVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzRlYmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbENvbnRhaW5lclRlc3RBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbENvbnRhaW5lclRlc3RBUEkgZXh0ZW5kcyBCYXNlVmlydHVhbFRlc3QgewotCQotCXByb3RlY3RlZCBJVmlydHVhbENvbnRhaW5lciBkZWxldGVtZVZpcnR1YWxGb2xkZXIyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVBhdGggREVMRVRFTUVfUEFUSDIgPSBuZXcgUGF0aCgiL2RlbGV0ZW1lMiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVZpcnR1YWxDb250YWluZXJUZXN0QVBJKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0gCi0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZSgpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyMiA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKERFTEVURU1FX1BBVEgyKTsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyMi5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlcjIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZXhpc3RzKCkgewotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCgiL2RlbGV0ZW1lIik7Ci0JCWJvb2xlYW4gYlJldFZhbHVlID0gY29udGFpbmVyLmV4aXN0cyhwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRNZW1iZXIoKSB7Ci0JCVN0cmluZyBuYW1lID0gImxpYiI7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmZpbmRNZW1iZXIobmFtZSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZmluZE1lbWJlcjIoKSB7Ci0JCVN0cmluZyBuYW1lID0gImxpYiI7Ci0JCWludCBzZWFyY2hGbGFncyA9IDA7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmZpbmRNZW1iZXIobmFtZSxzZWFyY2hGbGFncyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfZmluZE1lbWJlcjMoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aCgiL2xpYiIpOwotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2U9IGNvbnRhaW5lci5maW5kTWVtYmVyKHBhdGgpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2ZpbmRNZW1iZXI0KCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoIi9saWIiKTsKLQkJaW50IHNlYXJjaEZsYWdzID0gMDsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZmluZE1lbWJlcihwYXRoLHNlYXJjaEZsYWdzKTsKLQl9Ci0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZSgpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZ2V0RmlsZShwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2dldEZvbGRlcigpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKCIvZGVsZXRlbWUiKTsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlIHJlc291cmNlPSBjb250YWluZXIuZ2V0Rm9sZGVyKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsZTIoKSB7Ci0JCVN0cmluZyBuYW1lID0gIi9kZWxldGVtZSI7Ci0JCUlWaXJ0dWFsQ29udGFpbmVyIGNvbnRhaW5lciA9IHdlYkluZkZvbGRlcjsKLQkJSVZpcnR1YWxSZXNvdXJjZSByZXNvdXJjZT0gY29udGFpbmVyLmdldEZpbGUobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9nZXRGb2xkZXIyKCkgewotCQlTdHJpbmcgbmFtZSA9ICIvZGVsZXRlbWUiOwotCQlJVmlydHVhbENvbnRhaW5lciBjb250YWluZXIgPSB3ZWJJbmZGb2xkZXI7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2U9IGNvbnRhaW5lci5nZXRGb2xkZXIobmFtZSk7Ci0JfQotCi0JcHVibGljICB2b2lkIHRlc3RfbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2U9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb250YWluZXIgY29udGFpbmVyID0gd2ViSW5mRm9sZGVyOwotCQlpbnQgbWVtYmVyRmxhZ3MgPSAwOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2U9IGNvbnRhaW5lci5tZW1iZXJzKG1lbWJlckZsYWdzKTsKLQkJCi0KLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbEZpbGVBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0YzMxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgSVZpcnR1YWxGaWxlQVBJVGVzdCBleHRlbmRzIEJhc2VWaXJ0dWFsVGVzdCB7Ci0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxGaWxlIHRlc3RGaWxlMTsKLQlwcm90ZWN0ZWQgSUZpbGUgcmVhbFRlc3RGaWxlMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggVEVTVF9GSUxFX1JFQUxfUEFUSCA9IG5ldyBQYXRoKCJXZWJNb2R1bGUxL3Rlc3RkYXRhL1Rlc3RGaWxlMS50eHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFRFU1RfRklMRV9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBJVmlydHVhbEZpbGVBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCXRlc3RGaWxlMSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIKTsgCi0JCXJlYWxUZXN0RmlsZTEgPSBURVNUX1BST0pFQ1QuZ2V0RmlsZShURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlKCkgewotCQlJRmlsZSBmaWxlID0gdGVzdEZpbGUxLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlcygpIHsKLQkJSUZpbGVbXSBmaWxlID0gdGVzdEZpbGUxLmdldFVuZGVybHlpbmdGaWxlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBY2Nlc3NpYmxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuaXNBY2Nlc3NpYmxlKCksdHJ1ZSk7Ci0JCSgoSVZpcnR1YWxSZXNvdXJjZSlkZWxldGVtZVZpcnR1YWxGb2xkZXIpLmRlbGV0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLQkJLy9hc3NlcnRFcXVhbHMoZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmlzQWNjZXNzaWJsZSgpLGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM2NzlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsRm9sZGVyQVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0IFRFU1RfUFJPSkVDVCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChUZXN0V29ya3NwYWNlLlBST0pFQ1RfTkFNRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZPTERFUl9OQU1FID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFdFQklORl9GT0xERVJfUkVBTF9QQVRIID0gbmV3IFBhdGgoIi9XZWJNb2R1bGUxL1dlYkNvbnRlbnQvIitURVNUX0ZPTERFUl9OQU1FKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iK1RFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoIFRFU1REQVRBX0ZPTERFUl9SRUFMX1BBVEggPSBuZXcgUGF0aCgiV2ViTW9kdWxlMS90ZXN0ZGF0YSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGggVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBERUxFVEVNRV9QQVRIID0gbmV3IFBhdGgoIi9kZWxldGVtZSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbEZvbGRlciB3ZWJJbmZGb2xkZXI7Ci0JcHJpdmF0ZSBJQ29udGFpbmVyIHJlYWxXZWJJbmZGb2xkZXI7Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbEZvbGRlciBkZWxldGVtZVZpcnR1YWxGb2xkZXI7Ci0JcHJpdmF0ZSBJQ29udGFpbmVyIGRlbGV0ZW1lRm9sZGVyOwkKLQotCXB1YmxpYyBJVmlydHVhbEZvbGRlckFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfSAKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoSVZpcnR1YWxGb2xkZXJBUElUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsJCQotCQkKLQkJcmVhbFdlYkluZkZvbGRlciA9IFRFU1RfUFJPSkVDVC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVEVTVF9QUk9KRUNUKTsKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCQotCQl3ZWJJbmZGb2xkZXIgPSByb290Rm9sZGVyLmdldEZvbGRlcihXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSCk7IAkJCi0KLQkJcm9vdEZvbGRlci5nZXRGb2xkZXIoVEVTVERBVEFfRk9MREVSX1JVTlRJTUVfUEFUSCk7IAotCQlURVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoREVMRVRFTUVfUEFUSCk7Ci0JCWRlbGV0ZW1lVmlydHVhbEZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0JCQotCQlkZWxldGVtZUZvbGRlciA9IGRlbGV0ZW1lVmlydHVhbEZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7CQkKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygoKElWaXJ0dWFsUmVzb3VyY2UpZGVsZXRlbWVWaXJ0dWFsRm9sZGVyKS5leGlzdHMoKSx0cnVlKTsKLQkJKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkvLyBhc3NlcnRFcXVhbHMoZGVsZXRlbWVGb2xkZXIuZXhpc3RzKCksZmFsc2UpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJCi0JCWlmKGRlbGV0ZW1lRm9sZGVyLmV4aXN0cygpKQotCQkJZGVsZXRlbWVGb2xkZXIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIC9XRUItSU5GIGZvbGRlciBzaG91bGQgaGF2ZSBubyBmaWxlIGV4dGVuc2lvbi4iLCAoKElWaXJ0dWFsUmVzb3VyY2Upd2ViSW5mRm9sZGVyKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGb2xkZXJzKCkgewotCQlJQ29udGFpbmVyW10gYURlbGV0ZW1lRm9sZGVyID0gZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCWFzc2VydEVxdWFscyhhRGVsZXRlbWVGb2xkZXIubGVuZ3RoPT0xLHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ1Jlc291cmNlcygpIHsKLQkJSVJlc291cmNlW10gYURlbGV0ZW1lRm9sZGVyID0gKChJVmlydHVhbFJlc291cmNlKWRlbGV0ZW1lVmlydHVhbEZvbGRlcikuZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpOwotCQlhc3NlcnRFcXVhbHMoYURlbGV0ZW1lRm9sZGVyLmxlbmd0aD09MSx0cnVlKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEdldFZpcnR1YWxDb21wb25lbnRGcm9tUmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSBhRGVsZXRlbWVGb2xkZXIgPSAoKElWaXJ0dWFsUmVzb3VyY2UpZGVsZXRlbWVWaXJ0dWFsRm9sZGVyKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2VzKClbMF07Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpYURlbGV0ZW1lRm9sZGVyLmdldEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoY29tcC5nZXROYW1lKCksVGVzdFdvcmtzcGFjZS5QUk9KRUNUX05BTUUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ0ZvbGRlcigpIHsKLQkJSUNvbnRhaW5lciBhRGVsZXRlbWVGb2xkZXIgPSBkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCQlhc3NlcnROb3ROdWxsKGFEZWxldGVtZUZvbGRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKLQkJSVJlc291cmNlIGFEZWxldGVtZUZvbGRlciA9ICgoSVZpcnR1YWxSZXNvdXJjZSlkZWxldGVtZVZpcnR1YWxGb2xkZXIpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKGFEZWxldGVtZUZvbGRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSB7Ci0JCUlQYXRoIHJlYWxQYXRoID0gcmVhbFdlYkluZkZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9ICgoSVZpcnR1YWxSZXNvdXJjZSl3ZWJJbmZGb2xkZXIpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnQoKSB7IAotCQlhc3NlcnROb3ROdWxsKCgoSVZpcnR1YWxSZXNvdXJjZSl3ZWJJbmZGb2xkZXIpLmdldENvbXBvbmVudCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgewotCQlJUGF0aCByZWFsUGF0aCA9IHJlYWxXZWJJbmZGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9IHdlYkluZkZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lUGF0aCgpIHsgCi0JCUlQYXRoIHZpcnR1YWxQYXRoID0gKChJVmlydHVhbFJlc291cmNlKXdlYkluZkZvbGRlcikuZ2V0UnVudGltZVBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcnVudGltZSBwYXRoIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHJlYWwgcmVzb3VyY2UiLCBXRUJJTkZfRk9MREVSX1JVTlRJTUVfUEFUSCwgdmlydHVhbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG5hbWUuIiwgVEVTVF9GT0xERVJfTkFNRSwgd2ViSW5mRm9sZGVyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyZW50KCkgewotCQlhc3NlcnRFcXVhbHMoIlRoZSBwYXJlbnQgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgY29tcG9uZW50cyByb290IGZvbGRlci4iLCBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLCB3ZWJJbmZGb2xkZXIuZ2V0UGFyZW50KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgcmVzb3VyY2UgPSB3ZWJJbmZGb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCWJvb2xlYW4gYlJldFZhbHVlID0gcmVzb3VyY2UuZXF1YWxzKGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkpOwotCQlhc3NlcnRUcnVlKGJSZXRWYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2plY3QoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3Qgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdGVzdCBwcm9qZWN0LiIsIFRFU1RfUFJPSkVDVCwgKChJVmlydHVhbFJlc291cmNlKXdlYkluZkZvbGRlcikuZ2V0UHJvamVjdCgpKTsgLy8kTk9OLU5MUy0xJAotCX0gIAotCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgdGVzdCBwcm9qZWN0LiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCAoKElWaXJ0dWFsUmVzb3VyY2Upd2ViSW5mRm9sZGVyKS5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCS8qcHVibGljIHZvaWQgdGVzdEdldEZpbGVQYXRoKCkgewotCQlJVmlydHVhbEZpbGUgdGVzdDNqc3AgPSB0ZXN0ZGF0YUZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKCIvanNwcy9UZXN0SnNwMy5qc3AiKSk7Ci0JCQotCQlJUGF0aCBleHBlY3RlZFBhdGggPSBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRILmFwcGVuZChuZXcgUGF0aCgiL2pzcHMvVGVzdEpzcDMuanNwIikpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0ZXN0IGZpbGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIG11c3QgbWF0Y2guIiwgZXhwZWN0ZWRQYXRoLCB0ZXN0M2pzcC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JfSovCi0JCi0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBkZWxldGUoaW50LCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCS8qcHVibGljIHZvaWQgdGVzdERlbGV0ZWludElQcm9ncmVzc01vbml0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVsZXRlbWVWaXJ0dWFsRm9sZGVyLmRlbGV0ZSgwLCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIlRoZSByZWFsIGZvbGRlciBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIElWaXJ0dWFsUmVzb3VyY2UuREVMRVRFX01FVEFNT0RFTF9PTkxZIGlzIE5PVCBzdXBwbGllZC4iLCAhZGVsZXRlbWVGb2xkZXIuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gY29tcG9uZW50Lm1lbWJlcnMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaWYobWVtYmVyc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0UnVudGltZVBhdGgoKSkpIHsKLQkJCQlmYWlsKCJGb3VuZCBkZWxldGVkIGZvbGRlciBpbiBtZW1iZXJzKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9CQkKLQl9Ki8KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkvKnB1YmxpYyB2b2lkIHRlc3REZWxldGVpbnRJUHJvZ3Jlc3NNb25pdG9yMigpIHRocm93cyBFeGNlcHRpb24gewotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgZm9sZGVyIHNob3VsZCBub3QgYmUgZGVsZXRlZCB3aGVuIElWaXJ0dWFsUmVzb3VyY2UuREVMRVRFX01FVEFNT0RFTF9PTkxZIGlzIHN1cHBsaWVkLiIsIGRlbGV0ZW1lRm9sZGVyLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQkvLyBvbmx5IGhhbmRsZXMgZXhwbGljaXQgbWFwcGluZ3MKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSSSBydW50aW1lVVJJID0gVVJJLmNyZWF0ZVVSSShkZWxldGVtZVZpcnR1YWxGb2xkZXIuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShURVNUX1BST0pFQ1QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50QnlOYW1lKFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8xX05BTUUpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSB3YkNvbXBvbmVudC5maW5kV29ya2JlbmNoTW9kdWxlUmVzb3VyY2VCeURlcGxveVBhdGgocnVudGltZVVSSSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgbm8gbWF0Y2hpbmcgY29tcG9uZW50cyBmb3VuZCBpbiB0aGUgbW9kZWwuIiwgcmVzb3VyY2VzLmxlbmd0aCA9PSAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ki8KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JLypwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlYm9vbGVhbklQcm9ncmVzc01vbml0b3IoKSAgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQlkZWxldGVtZVZpcnR1YWxGb2xkZXIuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgZm9sZGVyIHNob3VsZCBiZSBkZWxldGVkIHdoZW4gSVZpcnR1YWxSZXNvdXJjZS5ERUxFVEVfTUVUQU1PREVMX09OTFkgaXMgTk9UIHN1cHBsaWVkLiIsICFkZWxldGVtZUZvbGRlci5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb21wb25lbnQubWVtYmVycygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihtZW1iZXJzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKGRlbGV0ZW1lVmlydHVhbEZvbGRlci5nZXRSdW50aW1lUGF0aCgpKSkgewotCQkJCWZhaWwoIkZvdW5kIGRlbGV0ZWQgZm9sZGVyIGluIG1lbWJlcnMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCi0JfQkqLyAKLQkgCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhMTAxMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL0lWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgSVZpcnR1YWxSZWZlcmVuY2VBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCXJlZmVyZW5jZS5jcmVhdGUoMCxudWxsKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJ1bnRpbWVQYXRoKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlyZWZlcmVuY2Uuc2V0UnVudGltZVBhdGgobmV3IFBhdGgoIi8iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJ1bnRpbWVQYXRoKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlJUGF0aCBwYXRoID0gcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERlcGVuZGVuY3lUeXBlKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlpbnQgZGVwZW5kZW5jeVR5cGUgPSAwOwotCQlyZWZlcmVuY2Uuc2V0RGVwZW5kZW5jeVR5cGUoZGVwZW5kZW5jeVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXBlbmRlbmN5VHlwZSgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJaW50IGRlcGVuZGVuY3lUeXBlID0gMDsKLQkJZGVwZW5kZW5jeVR5cGUgPSByZWZlcmVuY2UuZ2V0RGVwZW5kZW5jeVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlib29sZWFuIGV4aXN0cyA9IHJlZmVyZW5jZS5leGlzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW5jbG9zaW5nQ29tcG9uZW50KCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb21wb25lbnQoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZUFQSUZWVFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZUFQSUZWVFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1YzkwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVBUElGVlRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzLlRlc3RXb3Jrc3BhY2U7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRvIHJ1biB0aGlzIHRlc3QsIGV4dHJhY3QgdGhlIC90ZXN0RGF0YS92aXJ0dWFsLWFwaS10ZXN0X3dvcmtzcGFjZS56aXAgZm91bmQgdW5kZXIgdGhlIHNhbWUKLSAqIHBsdWdpbiwgYW5kIHVzZSAiUnVuIEFzIC0+IEpVbml0IFBsdWdpbiBUZXN0Ii4gQmUgc3VyZSB0byBwb2ludCB0aGUgY29uZmlndXJhdGlvbiBhdCB0aGUKLSAqIGV4dHJhY3RlZCB3b3Jrc3BhY2UsIGFuZCBtYWtlIHN1cmUgdGhhdCAiQ2xlYXIgd29ya3NwYWNlIGNvbnRlbnRzIiBpcyBOT1QgY2hlY2tlZC4gVGhlIHRlc3QgbWF5Ci0gKiBiZSBydW4gdXNpbmcgYSBIZWFkbGVzcyBFY2xpcHNlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQ29yZUFQSUZWVFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJRk9MREVSX0NMQVNTID0gSVZpcnR1YWxGb2xkZXIuY2xhc3M7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUZJTEVfQ0xBU1MgPSBJVmlydHVhbEZpbGUuY2xhc3M7Ci0KLQlwcml2YXRlIGZpbmFsIE1hcCB2aXJ0dWFsUmVzb3VyY2VUcmVlID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgSUdOT1JFID0gbmV3IEhhc2hNYXAoKTsKLQotCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGUoTW9kdWxlQ29yZUFQSUZWVFRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBNb2R1bGVDb3JlQVBJRlZUVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXNldHVwTmF2aWdhdGVDb21wb25lbnRUZXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7IAotCQl0ZWFyRG93bkNyZWF0ZU5ld01vZHVsZVRlc3QoKTsKLQkJdGVhckRvd25DcmVhdGVMaW5rVGVzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlYXJEb3duQ3JlYXRlTmV3TW9kdWxlVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRm9sZGVyIHJvb3RGb2xkZXIgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKS5nZXRGb2xkZXIoVGVzdFdvcmtzcGFjZS5ORVdfV0VCX01PRFVMRV9OQU1FKTsKLQkJaWYgKHJvb3RGb2xkZXIuZXhpc3RzKCkpCi0JCQlyb290Rm9sZGVyLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuQUxXQVlTX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG51bGwpOwotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCi0JCQlpZiAod2JDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQl3YkNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS5yZW1vdmUoY29tcG9uZW50UmVzb3VyY2VzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmUobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIE1hcCBzdHJ1Y3R1cmUgdGhhdCBtaW1pY3MgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBvbiBkaXNrLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwTmF2aWdhdGVDb21wb25lbnRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGltYWdlczsKLQkJSVBhdGgganNwczsKLQkJSVBhdGggV0VCX0lORjsKLQkJVGVzdFdvcmtzcGFjZS5pbml0KCk7Ci0JCXZpcnR1YWxSZXNvdXJjZVRyZWUucHV0KChpbWFnZXMgPSBuZXcgUGF0aCgiaW1hZ2VzIikpLCBuZXcgSGFzaE1hcCgpKTsgLy8kTk9OLU5MUy0xJAotCQl2aXJ0dWFsUmVzb3VyY2VUcmVlLnB1dCgoanNwcyA9IG5ldyBQYXRoKCJqc3BzIikpLCBuZXcgSGFzaE1hcCgpKTsgLy8kTk9OLU5MUy0xJAotCQl2aXJ0dWFsUmVzb3VyY2VUcmVlLnB1dChuZXcgUGF0aChUZXN0V29ya3NwYWNlLk1FVEFfSU5GKSwgbmV3IEhhc2hNYXAoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQoKFdFQl9JTkYgPSBuZXcgUGF0aChUZXN0V29ya3NwYWNlLldFQl9JTkYpKSwgbmV3IEhhc2hNYXAoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQobmV3IFBhdGgoIlRlc3RGaWxlMS50eHQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJdmlydHVhbFJlc291cmNlVHJlZS5wdXQobmV3IFBhdGgoIlRlc3RGaWxlMi50eHQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkoKE1hcCkgdmlydHVhbFJlc291cmNlVHJlZS5nZXQoaW1hZ2VzKSkucHV0KG5ldyBQYXRoKCJpY29uLmdpZiIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCSgoTWFwKSB2aXJ0dWFsUmVzb3VyY2VUcmVlLmdldChqc3BzKSkucHV0KG5ldyBQYXRoKCJUZXN0SnNwMS5qc3AiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KGpzcHMpKS5wdXQobmV3IFBhdGgoIlRlc3RKc3AyLmpzcCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkoKE1hcCkgdmlydHVhbFJlc291cmNlVHJlZS5nZXQoanNwcykpLnB1dChuZXcgUGF0aCgiVGVzdEpzcDMuanNwIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KFdFQl9JTkYpKS5wdXQobmV3IFBhdGgoIndlYi54bWwiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJKChNYXApIHZpcnR1YWxSZXNvdXJjZVRyZWUuZ2V0KFdFQl9JTkYpKS5wdXQobmV3IFBhdGgoImNsYXNzZXMiKSwgSUdOT1JFKTsgLy8kTk9OLU5MUy0xJAotCQkoKE1hcCkgdmlydHVhbFJlc291cmNlVHJlZS5nZXQoV0VCX0lORikpLnB1dChuZXcgUGF0aCgibGliIiksIG5ldyBIYXNoTWFwKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBhbmQgcmVtb3ZlcyB0aGUgbWFwcGluZyBhbmQgZm9sZGVyIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGJ5Ci0JICoge0BsaW5rIE1vZHVsZUNvcmVBUElGVlRUZXN0I3Rlc3RDcmVhdGVMaW5rKCl9LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlYXJEb3duQ3JlYXRlTGlua1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBtb2R1bGUySW1hZ2VzID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvV2ViTW9kdWxlMi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZHVsZTJJbWFnZXMuZXhpc3RzKCkpCi0JCQltb2R1bGUySW1hZ2VzLmRlbGV0ZShJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuQUxXQVlTX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG51bGwpOwotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCi0JCQlDb21wb25lbnRSZXNvdXJjZVtdIGNvbXBvbmVudFJlc291cmNlcyA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd2JDb21wb25lbnQuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGNvbXBvbmVudFJlc291cmNlc1tpXSk7Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmUobnVsbCk7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFzc2VydFRyZWUoTWFwIHJlc291cmNlVHJlZSwgSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRyZWUocmVzb3VyY2VUcmVlLCB2aXJ0dWFsRm9sZGVyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbGwgbWV0aG9kcyBsaXNlZCBpbiB0aGUgInNlZSIgY2xhdXNlcyBhcmUgdGVzdGVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIElDb250YWluZXIjbWVtYmVycygpCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlVHJlZQotCSAqIEBwYXJhbSB2aXJ0dWFsRm9sZGVyCi0JICogQHBhcmFtIGluZGVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFzc2VydFRyZWUoTWFwIHJlc291cmNlVHJlZSwgSVZpcnR1YWxGb2xkZXIgdmlydHVhbEZvbGRlciwgU3RyaW5nIGluZGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEFQSV9URVNUIFZpcnR1YWxDb250YWluZXIubWVtYmVycygpCi0JCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gdmlydHVhbEZvbGRlci5tZW1iZXJzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBjb250YWluZWQgYnkgXCIiICsgdmlydHVhbEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgKyAiXCIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcmVzb3VyY2VUcmVlLnNpemUoKSwgbWVtYmVycy5sZW5ndGgpOwotCQlJUGF0aCByZWxhdGl2ZVBhdGg7Ci0JCU1hcCBzdWJUcmVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbmRlbnQgKyBtZW1iZXJzW2ldKTsKLQkJCXJlbGF0aXZlUGF0aCA9IG5ldyBQYXRoKG1lbWJlcnNbaV0uZ2V0TmFtZSgpKTsKLQotCQkJc3ViVHJlZSA9IChNYXApIHJlc291cmNlVHJlZS5nZXQocmVsYXRpdmVQYXRoKTsKLQkJCWlmIChzdWJUcmVlICE9IG51bGwpIHsKLQkJCQlhc3NlcnRUeXBlKG1lbWJlcnNbaV0sIElGT0xERVJfQ0xBU1MpOwotCQkJCWlmIChzdWJUcmVlICE9IElHTk9SRSkKLQkJCQkJYXNzZXJ0VHJlZShzdWJUcmVlLCAoSVZpcnR1YWxGb2xkZXIpIG1lbWJlcnNbaV0sIGluZGVudCArICJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCWFzc2VydFR5cGUobWVtYmVyc1tpXSwgSUZJTEVfQ0xBU1MpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYXNzZXJ0VHlwZShJVmlydHVhbFJlc291cmNlIHJlc291cmNlLCBDbGFzcyB0eXBlKSB7Ci0JCWFzc2VydFRydWUoIkV4cGVjdGVkIGEobikgIiArIHR5cGUuZ2V0TmFtZSgpICsgIiBmb3IgbWVtYmVyOiAiICsgcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdHlwZS5pc0luc3RhbmNlKHJlc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWxsIG1ldGhvZHMgbGlzZWQgaW4gdGhlICJzZWUiIGNsYXVzZXMgYXJlIHRlc3RlZCBieSB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBDb21wb25lbnRDb3JlI2NyZWF0ZUNvbXBvbmVudChJUHJvamVjdCwgU3RyaW5nKQotCSAqIEBzZWUgSUNvbnRhaW5lciNnZXRGb2xkZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqIEBzZWUgSUNvbnRhaW5lciNtZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TmF2aWdhdGVDb21wb25lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSwgVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFXzFfTkFNRSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbEZvbGRlciByb290ID0gcm9vdEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQgCi0JCS8vIFRPRE8KLQkJLy9hc3NlcnRUcmVlKHZpcnR1YWxSZXNvdXJjZVRyZWUsIHJvb3QpOwotCi0JfQotCi0KLQkvKioKLQkgKiA8cD4KLQkgKiBBbGwgbWV0aG9kcyBsaXNlZCBpbiB0aGUgInNlZSIgY2xhdXNlcyBhcmUgdGVzdGVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIENvbXBvbmVudENvcmUjY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0LCBTdHJpbmcpCi0JICogQHNlZSBJQ29udGFpbmVyI2dldEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICogQHNlZSBJRm9sZGVyI2NyZWF0ZUxpbmsob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKi8KLS8qIEJ1ZyAxNjAxMDEJCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUxpbmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKSwgVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFXzJfTkFNRSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbEZvbGRlciBpbWFnZXMgPSByb290Rm9sZGVyLmdldEZvbGRlcihuZXcgUGF0aCgiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCSgoSVZpcnR1YWxSZXNvdXJjZSlpbWFnZXMpLmNyZWF0ZUxpbmsobmV3IFBhdGgoIi9XZWJNb2R1bGUyL2ltYWdlcyIpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlGb2xkZXIgcmVhbEltYWdlcyA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldEZvbGRlcihuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSAvV2ViQ29udGVudDIvaW1hZ2VzIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIsIHJlYWxJbWFnZXMuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0KLQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBtYXBwaW5nIGZvciB2aXJ0dWFsIHBhdGggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA+IDApOyAvLyROT04tTkxTLTEkCi0KLQkJCVJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0U291cmNlUmVzb3VyY2VUcmVlUm9vdCh3YkNvbXBvbmVudCk7Ci0JCQljb21wb25lbnRSZXNvdXJjZXMgPSByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMocmVhbEltYWdlcy5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCi0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgQ29tcG9uZW50IHJlc291cmNlIHdpdGggdGhlIHNvdXJjZSBwYXRoIFwiIiArIHJlYWxJbWFnZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPT0gMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlhc3NlcnRUcnVlKCJUaGUgcnVudGltZSBwYXRoIHNob3VsZCBtYXRjaCBcIi9pbWFnZXNcIi4iLCBjb21wb25lbnRSZXNvdXJjZXNbMF0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIGNvbXBvbmVudCByZXNvdXJjZSBpcyBjcmVhdGVkCi0KLQkJCWltYWdlcy5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvV2ViTW9kdWxlMi9pbWFnZXMiKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJY29tcG9uZW50UmVzb3VyY2VzID0gcmVzb3VyY2VUcmVlUm9vdC5maW5kTW9kdWxlUmVzb3VyY2VzKHJlYWxJbWFnZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyByZWFsSW1hZ2VzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJ1bnRpbWUgcGF0aCBzaG91bGQgbWF0Y2ggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCi0JfQotKi8KLQkvKioKLQkgKiA8cD4KLQkgKiBBbGwgbWV0aG9kcyBsaXNlZCBpbiB0aGUgInNlZSIgY2xhdXNlcyBhcmUgdGVzdGVkIGJ5IHRoaXMgbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIENvbXBvbmVudENvcmUjY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0LCBTdHJpbmcpCi0JICogQHNlZSBJQ29udGFpbmVyI2dldEZvbGRlcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICogQHNlZSBJRm9sZGVyI2NyZWF0ZUxpbmsob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2ViTW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vVE9ETyAtIFJlZG8gdGVzdHMKLQotLy8JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLCBUZXN0V29ya3NwYWNlLk5FV19XRUJfTU9EVUxFX05BTUUpOwotLy8JCS8vIGlmKCFjb21wb25lbnQuZXhpc3RzKCkpCi0vLwkJY29tcG9uZW50LmNyZWF0ZSgwLCBudWxsKTsKLS8vCQkKLS8vCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLS8vCQlJVmlydHVhbEZvbGRlciByb290ID0gcm9vdEZvbGRlci5nZXRGb2xkZXIobmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlJUGF0aCByZWFsV2ViQ29udGVudFBhdGggPSBuZXcgUGF0aChUZXN0V29ya3NwYWNlLlBST0pFQ1RfTkFNRSArIElQYXRoLlNFUEFSQVRPUiArICJXZWJDb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLS8vCQlyb290LmNyZWF0ZUxpbmsocmVhbFdlYkNvbnRlbnRQYXRoLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlJVmlydHVhbEZvbGRlciBtZXRhSW5mRm9sZGVyID0gcm9vdC5nZXRGb2xkZXIoVGVzdFdvcmtzcGFjZS5NRVRBX0lORik7Ci0vLwkJbWV0YUluZkZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0vLwotLy8JCUlWaXJ0dWFsRm9sZGVyIHdlYkluZkZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKFRlc3RXb3Jrc3BhY2UuV0VCX0lORik7Ci0vLwkJd2ViSW5mRm9sZGVyLmNyZWF0ZShJVmlydHVhbFJlc291cmNlLkZPUkNFLCBudWxsKTsKLS8vCi0vLwkJSUZvbGRlciByZWFsV2ViQ29udGVudCA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldEZvbGRlcihyZWFsV2ViQ29udGVudFBhdGgpOwotLy8JCWFzc2VydFRydWUoIlRoZSAiICsgcmVhbFdlYkNvbnRlbnQgKyAiIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIsIHJlYWxXZWJDb250ZW50LmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCUlGb2xkZXIgcmVhbE1ldGFJbmZGb2xkZXIgPSByZWFsV2ViQ29udGVudC5nZXRGb2xkZXIoVGVzdFdvcmtzcGFjZS5NRVRBX0lORik7Ci0vLwkJYXNzZXJ0VHJ1ZSgiVGhlICIgKyByZWFsTWV0YUluZkZvbGRlciArICIgZGlyZWN0b3J5IG11c3QgZXhpc3QuIiwgcmVhbE1ldGFJbmZGb2xkZXIuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCi0vLwkJSUZvbGRlciByZWFsV2ViSW5mRm9sZGVyID0gcmVhbFdlYkNvbnRlbnQuZ2V0Rm9sZGVyKFRlc3RXb3Jrc3BhY2UuV0VCX0lORik7Ci0vLwkJYXNzZXJ0VHJ1ZSgiVGhlICIgKyByZWFsV2ViSW5mRm9sZGVyICsgIiBkaXJlY3RvcnkgbXVzdCBleGlzdC4iLCByZWFsV2ViSW5mRm9sZGVyLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0vLwkJdHJ5IHsKLS8vCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCkpOwotLy8JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotLy8KLS8vCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb21wb25lbnRSZXNvdXJjZXMgPSB3YkNvbXBvbmVudC5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChuZXcgUGF0aCgiLyIgKyBUZXN0V29ya3NwYWNlLk1FVEFfSU5GKSk7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgbWFwcGluZyBmb3IgdmlydHVhbCBwYXRoIFwiLyIgKyBUZXN0V29ya3NwYWNlLk1FVEFfSU5GICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPiAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8JCQlSZXNvdXJjZVRyZWVSb290IHJlc291cmNlVHJlZVJvb3QgPSBSZXNvdXJjZVRyZWVSb290LmdldFNvdXJjZVJlc291cmNlVHJlZVJvb3Qod2JDb21wb25lbnQpOwotLy8JCQljb21wb25lbnRSZXNvdXJjZXMgPSByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMobWV0YUluZkZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotLy8KLS8vCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyBtZXRhSW5mRm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCi0vLwkJCWFzc2VydFRydWUoIlRoZSBydW50aW1lIHBhdGggc2hvdWxkIG1hdGNoIFwiLyIgKyBUZXN0V29ya3NwYWNlLk1FVEFfSU5GICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlc1swXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvIiArIFRlc3RXb3Jrc3BhY2UuTUVUQV9JTkYpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLS8vCQkJCi0vLwkJCS8vIHRyeSB0byBmb3JjZSBkdXBsaWNhdGUgbWFwcGluZ3MKLS8vCQkJbWV0YUluZkZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0vLwkJCXdlYkluZkZvbGRlci5jcmVhdGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7Ci0vLwkJCQotLy8JCQkvLyBlbnN1cmUgdGhhdCBtdWx0aXBsZSBtYXBwaW5ncyBhcmVuJ3QgYWRkZWQKLS8vCQkJCi0vLwkJCWFzc2VydFRydWUoIlRoZSBtYXBwaW5nIHNob3VsZCBub3QgYmUgZHVwbGljYXRlZC4iLCAhaXNEdXBsaWNhdGVkKHdiQ29tcG9uZW50LCBtZXRhSW5mRm9sZGVyLmdldFJ1bnRpbWVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlhc3NlcnRUcnVlKCJUaGUgbWFwcGluZyBzaG91bGQgbm90IGJlIGR1cGxpY2F0ZWQuIiwgIWlzRHVwbGljYXRlZCh3YkNvbXBvbmVudCwgd2ViSW5mRm9sZGVyLmdldFJ1bnRpbWVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0gZmluYWxseSB7Ci0vLwkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0vLwkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLS8vCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVkKFdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJCi0JCVVSSSBydW50aW1lVVJJID0gVVJJLmNyZWF0ZVVSSShydW50aW1lUGF0aC50b1N0cmluZygpKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlMaXN0IHJlc291cmNlTGlzdCA9IHdiQ29tcG9uZW50LmdldFJlc291cmNlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhydW50aW1lVVJJKSkKLQkJCQlpZihmb3VuZCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCX0JCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZU5hdHVyZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZU5hdHVyZUFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlNDRkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL01vZHVsZUNvcmVOYXR1cmVBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Db21tb25UZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVOYXR1cmVBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZVNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEFydGlmYWN0RWRpdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYk1vZHVsZTEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9NT0RFTF9JRCA9ICJqc3Qud2ViIjsKLQlwcml2YXRlIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiVGVzdERhdGEiICsgZmlsZVNlcCArICJUZXN0QXJ0aWZhY3RFZGl0LnppcCIpOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCi0JLy8gL1RoaXMgc2hvdWxkIGJlIGV4dHJhY3RlZCBvdXQsIGRvbnQgaGF2ZSB0aW1lLCBqdXN0IHRyeWluZyB0byBnZXQgY292ZXJhZ2UKLQkvLyBmb3IgbTQgaW50ZWdyYXRpb24uLi4uCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoIWdldFRhcmdldFByb2plY3QoKS5leGlzdHMoKSkKLQkJCWlmICghY3JlYXRlUHJvamVjdCgpKQotCQkJCWZhaWwoKTsKLQkJcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQl9Ci0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlUHJvamVjdCgpIHsKLQkJSVBhdGggbG9jYWxaaXBQYXRoID0gZ2V0TG9jYWxQYXRoKCk7Ci0JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGxvY2FsWmlwUGF0aCwgbmV3IFN0cmluZ1tde1BST0pFQ1RfTkFNRX0pOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQlVUkwgdXJsID0gQ29tbW9uVGVzdHNQbHVnaW4uaW5zdGFuY2UuZmluZCh6aXBGaWxlUGF0aCk7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZSgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQluYXR1cmUuY29uZmlndXJlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNb2R1bGVDb3JlTmF0dXJlKCkgewotCQluZXcgTW9kdWxlQ29yZU5hdHVyZSgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlU3RydWN0dXJhbE1vZGVsRm9yUmVhZCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCW5hdHVyZS5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JSZWFkKHRoaXMpOwotCQlBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCA9IG5hdHVyZS5nZXRBcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQobW9kdWxlVVJJLCB0aGlzKTsKLQkJYXNzZXJ0Tm90TnVsbChtb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZVN0cnVjdHVyYWxNb2RlbEZvcldyaXRlKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwgPSBuYXR1cmUuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JXcml0ZShtb2R1bGVVUkksIHRoaXMpOwotCQlhc3NlcnROb3ROdWxsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbmF0dXJlLmdldEVkaXRNb2RlbEZvclJlYWQoRURJVF9NT0RFTF9JRCwgdGhpcyk7Ci0JCWFzc2VydE5vdE51bGwobW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdEVkaXRNb2RlbEZvcldyaXRlKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJRWRpdE1vZGVsIG1vZGVsID0gbmF0dXJlLmdldEVkaXRNb2RlbEZvcldyaXRlKEVESVRfTU9ERUxfSUQsIHRoaXMpOwotCQlhc3NlcnROb3ROdWxsKG1vZGVsKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFN0cmluZyBnZXROYXR1cmVJRCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldE5hdHVyZUlEKCkgewotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJU3RyaW5nIGlkID0gbmF0dXJlLmdldE5hdHVyZUlEKCk7Ci0JCWFzc2VydFRydWUoaWQuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuTU9EVUxFX05BVFVSRV9JRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5Q29udHJpYnV0ZVRvQ29udGV4dCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCUVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNvbnRleHQgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dEJhc2UocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQluYXR1cmUucHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoY29udGV4dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZVNldCgpIHsKLQkJTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmdldE1vZHVsZUNvcmVOYXR1cmUocHJvamVjdCk7Ci0JCVJlc291cmNlU2V0IHNldCA9IG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpOwotCQlhc3NlcnROb3ROdWxsKHNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoKSB7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBjb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHRCYXNlKHByb2plY3QpOwotCQl0cnkgewotCQkJbmF0dXJlLnNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoY29udGV4dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFN0cmluZyBnZXRQbHVnaW5JRCgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFBsdWdpbklEKCkgewotCQkvLyBwcm90ZWN0ZWQgY2FudCB0ZXN0IHVubGVzcyBpbiBzYW1lIHBhY2thZ2UuLi4uCi0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KCkgewotCQl0cnkgewotCQkJcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nWzBdKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCU1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KHByb2plY3QsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbigpIHsKLQkJVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB1cmlFeCA9ICAgbmV3IFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24obW9kdWxlVVJJKTsKLQkJYXNzZXJ0Tm90TnVsbCh1cmlFeCk7Ci0JfQotCQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Nb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvTW9kdWxlQ29yZVVSSUNvbnZlcnRlclVuaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODFmYTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9Nb2R1bGVDb3JlVVJJQ29udmVydGVyVW5pdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLkNvbXBvbmVudENvcmVVUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHMuVGVzdFdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIE1vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdCAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKE1vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIE1vZHVsZUNvcmVVUklDb252ZXJ0ZXJVbml0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOyAgCi0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplRERVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCi0JCQotCQlDb21wb25lbnRDb3JlVVJJQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBDb21wb25lbnRDb3JlVVJJQ29udmVydGVyKFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJCi0JCVVSSSBpbnB1dFVSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvV2ViTW9kdWxlMS9XZWJNb2R1bGUxL1dFQi1JTkYvd2ViLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlVUkkgcmVzdWx0VVJJID0gY29udmVydGVyLm5vcm1hbGl6ZShpbnB1dFVSSSk7Ci0JCQotCQlVUkkgZXhwZWN0ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKCJwbGF0Zm9ybTovcmVzb3VyY2UvV2ViTW9kdWxlMS9XZWJNb2R1bGUxL1dlYkNvbnRlbnQvV0VCLUlORi93ZWIueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETwotCQkvL2Fzc2VydEVxdWFscygiVGhlIHJlc3VsdGFudCBVUkkgbXVzdCBtYXRjaCB0aGUgZXhwZWN0ZWQgVVJJIiwgZXhwZWN0ZWRVUkksIHJlc3VsdFVSSSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1N0cnVjdHVyZUVkaXRBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1N0cnVjdHVyZUVkaXRBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZDRmYWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0QVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHMuVGVzdFdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZUVkaXRBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlRlc3RBcnRpZmFjdEVkaXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfTkFNRSA9ICJXZWJNb2R1bGUxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBtb2R1bGVVUkkgPSBVUkkuY3JlYXRlVVJJKCJtb2R1bGU6L3Jlc291cmNlL1Rlc3RBcnRpZmFjdEVkaXQvV2ViTW9kdWxlMSIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfTU9ERUxfSUQgPSAianN0LndlYiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE1PREVMX1NUUkVTUyA9ICJzdHJlc3N0ZXN0IjsKLQlwcml2YXRlIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgiVGVzdERhdGEiICsgZmlsZVNlcCArICJUZXN0QXJ0aWZhY3RFZGl0LnppcCIpOwotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoU3RydWN0dXJlRWRpdEFQSVRlc3QuY2xhc3MpOwotCX0KLQotCS8vIC9UaGlzIHNob3VsZCBiZSBleHRyYWN0ZWQgb3V0LCBkb250IGhhdmUgdGltZSwganVzdCB0cnlpbmcgdG8gZ2V0IGNvdmVyYWdlCi0JLy8gZm9yIG00IGludGVncmF0aW9uLi4uLgotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFdvcmtzcGFjZS5pbml0KCk7Ci0JCXByb2plY3QgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlQ29yZU5hdHVyZSgpIHRocm93cyBFeGNlcHRpb257Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gU3RydWN0dXJlRWRpdC5nZXRNb2R1bGVDb3JlTmF0dXJlKG1vZHVsZVVSSSk7Ci0JCWFzc2VydE5vdE51bGwobmF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElQcm9qZWN0IGdldENvbnRhaW5pbmdQcm9qZWN0KFdvcmtiZW5jaENvbXBvbmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGFpbmluZ1Byb2plY3RXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUlQcm9qZWN0IGFQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdCh3YkNvbXBvbmVudCk7Ci0JCQlhc3NlcnROb3ROdWxsKGFQcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJUHJvamVjdCBnZXRDb250YWluaW5nUHJvamVjdChVUkkpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnRhaW5pbmdQcm9qZWN0VVJJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IGFQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChtb2R1bGVVUkkpOwotCQlhc3NlcnROb3ROdWxsKGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRFY2xpcHNlUmVzb3VyY2UoKSB7Ci0vLwkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0vLwkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZmluZENvbXBvbmVudEJ5TmFtZShXRUJfTU9EVUxFX05BTUUpOwotLy8JCQlDb21wb25lbnRSZXNvdXJjZSBjb21wb25lbnRSZXNvdXJjZSA9IHdiQ29tcG9uZW50LmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvVGVzdEFydGlmYWN0RWRpdC9XZWJNb2R1bGUxIikpWzBdOwotLy8JCQltb2R1bGVDb3JlLmdldEVjbGlwc2VSZXNvdXJjZShjb21wb25lbnRSZXNvdXJjZSk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotLy8JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0vLwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIAotCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdEdldE91dHB1dENvbnRhaW5lclJvb3QoKSB7Ci0vLwkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLS8vCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50QnlOYW1lKFdFQl9NT0RVTEVfTkFNRSk7Ci0vLwkJCUNvbXBvbmVudFJlc291cmNlIGNvbXBvbmVudFJlc291cmNlID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKSlbMF07Ci0vLwkJCVN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyUm9vdCh3YkNvbXBvbmVudCk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotLy8JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogCi0JICovCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0Q29udGFpbmVyc0ZvclByb2plY3QoKSB7Ci0vLwkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLS8vCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5maW5kQ29tcG9uZW50QnlOYW1lKFdFQl9NT0RVTEVfTkFNRSk7Ci0vLwkJCUNvbXBvbmVudFJlc291cmNlIGNvbXBvbmVudFJlc291cmNlID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKSlbMF07Ci0vLwkJCVN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyc0ZvclByb2plY3QocHJvamVjdCk7Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKG1vZHVsZUNvcmUgIT0gbnVsbCkgewotLy8JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldERlcGxveWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb257Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlTdHJpbmcgZGVwbG95TmFtZSA9IFN0cnVjdHVyZUVkaXQuZ2V0RGVwbG95ZWROYW1lKG1vZHVsZVVSSSk7Ci0JCQlhc3NlcnROb3ROdWxsKGRlcGxveU5hbWUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFR5cGUgdHlwZSA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29tcG9uZW50VHlwZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LHdiQ29tcG9uZW50LmdldE5hbWUoKSkpOwotCQkJYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmUoKSB7Ci0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCW1vZHVsZUNvcmUuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmVJZk5lY2Vzc2FyeSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCW1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZVByb2plY3RDb21wb25lbnRzSWZOZWNlc3NhcnkoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQltb2R1bGVDb3JlLnByZXBhcmVQcm9qZWN0Q29tcG9uZW50c0lmTmVjZXNzYXJ5KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRNb2RlbFJvb3QoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0Q29tcG9uZW50cyA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50TW9kZWxSb290KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHByb2plY3RDb21wb25lbnRzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNvdXJjZUNvbnRhaW5lcnMoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSBjb250YWluZXJzID0gbW9kdWxlQ29yZS5nZXRTb3VyY2VDb250YWluZXJzKHdiQ29tcG9uZW50KTsKLQkJCWFzc2VydE5vdE51bGwoY29udGFpbmVycyk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFdvcmtiZW5jaE1vZHVsZXMoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnRbXSBjb21wb25lbnRzID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGNvbXBvbmVudHMpOwotCQkJYXNzZXJ0VHJ1ZShjb21wb25lbnRzLmxlbmd0aCA+IDApOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV29ya2JlbmNoTW9kdWxlKCkgewotCi0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQl3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlKCJ0ZXN0Iik7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSA9IG1vZHVsZUNvcmUuY3JlYXRlV29ya2JlbmNoTW9kdWxlUmVzb3VyY2UocHJvamVjdC5nZXRGaWxlKCJXZWJNb2R1bGUxL05ld0ZvbGRlciIpKTsKLQkJCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQl9IGZpbmFsbHkgewotCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kdWxlVHlwZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFR5cGUgdHlwZSA9IG1vZHVsZUNvcmUuY3JlYXRlTW9kdWxlVHlwZShFRElUX01PREVMX0lEKTsKLQkJCWFzc2VydE5vdE51bGwodHlwZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKFVSSSwgVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aFVSSVVSSSgpIHRocm93cyBFeGNlcHRpb257Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCQlhc3NlcnROb3ROdWxsKG1vZHVsZUNvcmUpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWFzc2VydE5vdE51bGwod2JDb21wb25lbnQpOwotCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBtb2R1bGVDb3JlLmZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKG1vZHVsZVVSSSk7Ci0JCQlhc3NlcnROb3ROdWxsKHJlc291cmNlcyk7Ci0JCQlhc3NlcnRUcnVlKHJlc291cmNlcy5sZW5ndGggPiAwKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBDb21wb25lbnRSZXNvdXJjZVtdIGZpbmRSZXNvdXJjZXNCeVJ1bnRpbWVQYXRoKFVSSSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZFJlc291cmNlc0J5UnVudGltZVBhdGhVUkkoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gbW9kdWxlQ29yZS5maW5kUmVzb3VyY2VzQnlSdW50aW1lUGF0aChtb2R1bGVVUkksIG1vZHVsZVVSSSk7Ci0JCQlhc3NlcnROb3ROdWxsKHJlc291cmNlcyk7Ci0JCQlhc3NlcnRUcnVlKHJlc291cmNlcy5sZW5ndGggPiAwKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IG1vZHVsZUNvcmUuZmluZFJlc291cmNlc0J5U291cmNlUGF0aChtb2R1bGVVUkkpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZXMpOwotCQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZXMubGVuZ3RoID4gMCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQ29tcG9uZW50QnlOYW1lKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9ICBtb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaW5kQ29tcG9uZW50QnlVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0KTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlQ29yZSk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2JDb21wb25lbnQgPSBtb2R1bGVDb3JlLmZpbmRDb21wb25lbnRCeVVSSShtb2R1bGVVUkkpOwotCQkJYXNzZXJ0Tm90TnVsbCh3YkNvbXBvbmVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xvY2FsRGVwZW5kZW5jeSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCW1vZHVsZUNvcmUuaXNMb2NhbERlcGVuZGVuY3kobnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGaXJzdE1vZHVsZSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGVDb3JlKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9ICBtb2R1bGVDb3JlLmdldEZpcnN0TW9kdWxlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHdiQ29tcG9uZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvbXBvbmVudFVSSSgpIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJVVJJIHVyaSA9IFN0cnVjdHVyZUVkaXQuY3JlYXRlQ29tcG9uZW50VVJJKHByb2plY3QsICJ0ZXN0Q29tcCIpOwotCQlhc3NlcnROb3ROdWxsKHVyaSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9TdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzBhNTQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdGVzdHMvU3RydWN0dXJlRWRpdFN0cmVzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzLlRlc3RXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJUZXN0QXJ0aWZhY3RFZGl0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX05BTUUgPSAiV2ViTW9kdWxlMSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgbW9kdWxlVVJJID0gVVJJLmNyZWF0ZVVSSSgibW9kdWxlOi9yZXNvdXJjZS9UZXN0QXJ0aWZhY3RFZGl0L1dlYk1vZHVsZTEiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEID0gImpzdC53ZWIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRNT0RFTF9TVFJFU1MgPSAic3RyZXNzdGVzdCI7Ci0JcHJpdmF0ZSBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiVGVzdEFydGlmYWN0RWRpdC56aXAiKTsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFN0cnVjdHVyZUVkaXRTdHJlc3NUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvLyAvVGhpcyBzaG91bGQgYmUgZXh0cmFjdGVkIG91dCwgZG9udCBoYXZlIHRpbWUsIGp1c3QgdHJ5aW5nIHRvIGdldCBjb3ZlcmFnZQotCS8vIGZvciBtNCBpbnRlZ3JhdGlvbi4uLi4KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCQlwcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCk7Ci0JfQotCi0KLQlwdWJsaWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlUaHJlYWRBY2Nlc3MoKSB7Ci0JCQotCQlKb2JbXSB0ZXN0Sm9icyA9IG5ldyBKb2JbNTBdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlKb2Igam9iID0gbmV3IEpvYigiSm9iICIgKyBpKQotCQkgICAgICB7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJICAgICAgICB7Ci0JCSAgICAgICAgU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJICAgICAgICAgIHRyeQotCQkgICAgICAgICAgewotCQkgICAgICAgIAltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocHJvamVjdCk7Ci0JCSAgICAgICAgCVByb3BlcnR5IHByb3AgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJICAgICAgICAJcHJvcC5zZXROYW1lKCJKb2IgIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJICAgICAgICAJcHJvcC5zZXRWYWx1ZSgiQmxhaCIpOwotCQkgICAgICAgIAlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCSAgICAgICAgCQlpZiAobW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKSAhPSBudWxsKSB7Ci0JCSAgICAgICAgCQkJbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKS5nZXRQcm9wZXJ0aWVzKCkuYWRkKHByb3ApOwotCQkgICAgICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wLmdldE5hbWUoKSk7Ci0JCSAgICAgICAgCQkJbW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0JCSAgICAgICAgCQl9Ci0JCSAgICAgICAgCX0KLQkJICAgICAgICAgIH0KLQkJICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkJICAgICAgICAgIHsKLQkJICAgICAgICAJICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkgICAgICAgIAkgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICAgIGZpbmFsbHkgewotCQkgICAgICAgIAkgIGlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0JCSAgICAgICAgCQkgIG1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkgICAgICAgICAgfQotCQkgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIHB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBFRElUTU9ERUxfU1RSRVNTLmVxdWFscyhmYW1pbHkpOwotCQkJCX0KLQkJICAgICAgfTsKLQkJCXRlc3RKb2JzW2ldID0gam9iOwkKLQkJCX0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0Sm9icy5sZW5ndGg7IGorKykgewotCQkJSm9iIGpvYiA9IHRlc3RKb2JzW2pdOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKEVESVRNT0RFTF9TVFJFU1MsbnVsbCk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JfQotcHVibGljIHZvaWQgdGVzdE11bHRpVGhyZWFkQ29tcG9uZW50QWNjZXNzKCkgewotCQkKLQkJSm9iW10gdGVzdEpvYnMgPSBuZXcgSm9iWzUwXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0Sm9icy5sZW5ndGg7IGkrKykgewotCQkJSm9iIGpvYiA9IG5ldyBKb2IoIkpvYiAiICsgaSkKLQkJICAgICAgewotCQkgICAgICAgIAotCQkgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCSAgICAgICAgewotCQkgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJICAgICAgICBJUGF0aCBhUGF0aCA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJICAgICAgICBhc3NlcnRFcXVhbHMoYVBhdGgsbmV3IFBhdGgoIi9XZWJNb2R1bGUxL1dlYkNvbnRlbnQiKSk7Ci0JCSAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCSAgICAgICAgfQotCQkgICAgICAgIHB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBFRElUTU9ERUxfU1RSRVNTLmVxdWFscyhmYW1pbHkpOwotCQkJCX0KLQkJICAgICAgfTsKLQkJCXRlc3RKb2JzW2ldID0gam9iOwkKLQkJCX0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB0ZXN0Sm9icy5sZW5ndGg7IGorKykgewotCQkJSm9iIGpvYiA9IHRlc3RKb2JzW2pdOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKEVESVRNT0RFTF9TVFJFU1MsbnVsbCk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1Rlc3RXb3Jrc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5MzZlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3Rlc3RzL1Rlc3RXb3Jrc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHMuUHJvamVjdFVuemlwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFdvcmtzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiV2ViTW9kdWxlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFXzFfTkFNRSA9ICJXZWJNb2R1bGUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfMl9OQU1FID0gIldlYk1vZHVsZTIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dFQl9NT0RVTEVfTkFNRSA9ICJOZXdXZWJNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0lORiA9ICJNRVRBLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUGF0aCB6aXBGaWxlUGF0aCA9IG5ldyBQYXRoKCJ0ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAiKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0IFRFU1RfUFJPSkVDVCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChUZXN0V29ya3NwYWNlLlBST0pFQ1RfTkFNRSk7Ci0JICAJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNT0RVTEVfTkFNRVMgPSBuZXcgU3RyaW5nW117V0VCX01PRFVMRV8xX05BTUUsIFdFQl9NT0RVTEVfMl9OQU1FfTsgIAotCQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgewotCQkKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpCi0JCQkJY3JlYXRlUHJvamVjdCgpOwotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlUHJvamVjdCgpIHsKLQkJSVBhdGggbG9jYWxaaXBQYXRoID0gZ2V0TG9jYWxQYXRoKCk7Ci0JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGxvY2FsWmlwUGF0aCwgbmV3IFN0cmluZ1tde1BST0pFQ1RfTkFNRX0pOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLQkJVVJMIHVybCA9IENvbW1vblRlc3RzUGx1Z2luLmluc3RhbmNlLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3YjNlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQ29tbW9uVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQotCXByaXZhdGUgc3RhdGljIFBhdGggemlwRmlsZVBhdGggPSBuZXcgUGF0aCgidGVzdERhdGEvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuemlwIik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldExvY2FsUGF0aCgpOwotLy8JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGxvY2FsWmlwUGF0aCwgbmV3IFN0cmluZ1tdeyJEZWZlY3RWZXJpZmljYXRpb25Qcm9qZWN0In0pOwotLy8JCXV0aWwuY3JlYXRlUHJvamVjdHMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDk2ODYyKCkgeyAKLQkJCi0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoIi9XRUItSU5GL3dlYi54bWwiKTsKLQkJSVBhdGggZm9sZGVyUGF0aCA9IG5ldyBQYXRoKCIvV0VCLUlORiIpOwotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpLCAiRGVmZWN0VmVyaWZpY2F0aW9uUHJvamVjdCIpOwotCQkKLQkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgZmlsZVJlc291cmNlID0gcm9vdEZvbGRlci5maW5kTWVtYmVyKGZpbGVQYXRoKTsJCQotCQlhc3NlcnRFcXVhbHMoIlRoZSByZXR1cm5lZCB0eXBlIHNob3VsZCBiZSBhIGZpbGUuIiwgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLCBmaWxlUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQlJVmlydHVhbFJlc291cmNlIGZvbGRlclJlc291cmNlID0gcm9vdEZvbGRlci5maW5kTWVtYmVyKGZvbGRlclBhdGgpOwkJCi0JCWFzc2VydEVxdWFscygiVGhlIHJldHVybmVkIHR5cGUgc2hvdWxkIGJlIGEgZm9sZGVyLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb2xkZXJSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KCJEZWZlY3RWZXJpZmljYXRpb25Qcm9qZWN0Iik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRMb2NhbFBhdGgoKSB7Ci0JCVVSTCB1cmwgPSBDb21tb25UZXN0c1BsdWdpbi5pbnN0YW5jZS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsQ29tcG9uZW50QVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTY5ODQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb21wb25lbnRBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuTW9kdWxlVVJJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBJVmlydHVhbENvbXBvbmVudEFQSVRlc3QgZXh0ZW5kcyBJVmlydHVhbENvbnRhaW5lckFQSVRlc3QgewotCi0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50OwotCXByaXZhdGUgV29ya2JlbmNoQ29tcG9uZW50IHdvcmtiZW5jaENvbXBvbmVudDsKLQlwcml2YXRlIFN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdDsKLQkKLQlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnRBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOyAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSVZpcnR1YWxDb21wb25lbnRBUElUZXN0KCJ0ZXN0R2V0UmVmZXJlbmNlcyIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb1NldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQl2aXJ0dWFsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QsIFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8xX05BTUUpOwotCQlzdHJ1Y3R1cmVFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVCk7Ci0JCXdvcmtiZW5jaENvbXBvbmVudCA9IHN0cnVjdHVyZUVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQlzdXBlci50ZWFyRG93bigpOwotCQlpZihzdHJ1Y3R1cmVFZGl0ICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVFZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gdmlydHVhbENvbXBvbmVudC5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1ldGFQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSB2aXJ0dWFsQ29tcG9uZW50LmdldE1ldGFQcm9wZXJ0aWVzKCkgOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRhUmVzb3VyY2VzKCkgewotCQlJUGF0aFtdIG1ldGFyZXNvdXJjZXMgPSB2aXJ0dWFsQ29tcG9uZW50LmdldE1ldGFSZXNvdXJjZXMoKSA7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0YVJlc291cmNlcygpIHsKLQkJCi0JCUlQYXRoW10gbWV0YXJlc291cmNlcyA9IG5ldyBJUGF0aFsxXTsKLQkJbWV0YXJlc291cmNlc1swXSA9IG5ldyBQYXRoKCIvdGVzdCIpOwotCQl2aXJ0dWFsQ29tcG9uZW50LnNldE1ldGFSZXNvdXJjZXMobWV0YXJlc291cmNlcykgOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZXMoKSB7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICIvdGVzdCI7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZSA9IHJvb3RGb2xkZXIuZ2V0UmVzb3VyY2VzKHJlc291cmNlKSA7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZXMoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IHZpcnR1YWxDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkKLQkJZm9yKGludCBpPTA7IGk8cmVmZXJlbmNlcy5sZW5ndGg7aSsrKQotCQkJYXNzZXJ0UmVmZXJlbmNlKHJlZmVyZW5jZXNbaV0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzZXJ0UmVmZXJlbmNlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgeyAKLQkJTGlzdCByZWZlcmVuY2VkQ29tcG9uZW50cyA9IHdvcmtiZW5jaENvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSBudWxsOwotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IG51bGw7Ci0JCWZvcihpbnQgaT0wOyBpPHJlZmVyZW5jZWRDb21wb25lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VkQ29tcG9uZW50ID0gKFJlZmVyZW5jZWRDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnRzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJY29tcG9uZW50TmFtZSA9IE1vZHVsZVVSSVV0aWwuZ2V0RGVwbG95ZWROYW1lKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCkpOwotCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7ICAKLQkJCX0KLQkJCWlmKGNvbXBvbmVudE5hbWUgIT0gbnVsbCAmJiBjb21wb25lbnROYW1lLmVxdWFscyhyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKSkpIHsJCQkJCQotCQkJCWFzc2VydEVxdWFscygiVGhlIHJ1bnRpbWUgcGF0aHMgbXVzdCBtYXRjaC4iLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldFJ1bnRpbWVQYXRoKCksIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoIlRoZSB3b3JrYmVuY2ggY29tcG9uZW50IHNob3VsZCBtYXRjaCB0aGUgZW5jbG9zaW5nIGNvbXBvbmVudC4iLCB2aXJ0dWFsQ29tcG9uZW50LCByZWZlcmVuY2UuZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkpOwotCQkJCWFzc2VydEVxdWFscygiVGhlIGRlcGVuZGVuY3lUeXBlcyBzaG91bGQgbWF0Y2guIiwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbmN5VHlwZSgpLmdldFZhbHVlKCksIHJlZmVyZW5jZS5nZXREZXBlbmRlbmN5VHlwZSgpKTsKLQkJCQlVUkkgYWN0dWFsSGFuZGxlID0gTW9kdWxlVVJJVXRpbC5mdWxseVF1YWxpZnlVUkkocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOwotCQkJCWFzc2VydEVxdWFscygiVGhlIGhhbmRsZXMgc2hvdWxkIG1hdGNoLiIsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCksIGFjdHVhbEhhbmRsZSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmYWlsKCJBIG1hdGNoaW5nIHJlZmVyZW5jZSB3YXMgbm90IGZvdW5kIGZvciAiK3JlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpKTsgCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZmVyZW5jZXMoKSB7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbENvbnRhaW5lckFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxDb250YWluZXJBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzI5NDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbENvbnRhaW5lckFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElWaXJ0dWFsQ29udGFpbmVyQVBJVGVzdCBleHRlbmRzIElWaXJ0dWFsUmVzb3VyY2VBUElUZXN0IHsJCi0KLQlwcm90ZWN0ZWQgSVZpcnR1YWxDb250YWluZXIgdGFyZ2V0VmlydHVhbENvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciB0YXJnZXRQbGF0Zm9ybUNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRQbGF0Zm9ybUNvbnRhaW5lclBhdGg7Ci0JCi0JLyoKLQkgKiAgVGhlIGZvbGxvd2luZyBmaWVsZHMgYXNzdW1lIGEgbWluaW11bSBzdHJ1Y3R1cmUgb2Y6Ci0JICogIAotCSAqICAgLwkJCQkJCVtSb290XQotCSAqICAgCS9qc3BzCQkJCVtGb2xkZXJdCi0JICogICAJCS9UZXN0SnNwMy5qc3AJW0ZpbGVdCi0JICogICAJL1dFQi1JTkYJCQlbRm9sZGVyXQotCSAqICAgCQkvbGliCQkJW0ZvbGRlcl0KLQkgKiAgIC9UZXN0RmlsZTEudHh0CQkJW0ZpbGVdCi0JICogCi0JICovCi0JCi0JCi0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkRmlsZVNpbmdsZURlcHRoUGF0aCA9IG5ldyBQYXRoKCIvanNwcy9UZXN0SnNwMy5qc3AiKTsKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRGb2xkZXJTaW5nbGVEZXB0aFBhdGggPSBuZXcgUGF0aCgiV0VCLUlORi9saWIiKTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4cGVjdGVkRm9sZGVyTmFtZSA9ICJqc3BzIjsKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRGb2xkZXJaZXJvdGhEZXB0aFBhdGggPSBuZXcgUGF0aChleHBlY3RlZEZvbGRlck5hbWUpOwotCQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4cGVjdGVkRmlsZU5hbWUgPSAiVGVzdEZpbGUxLnR4dCI7Ci0JcHJvdGVjdGVkIElQYXRoIGV4cGVjdGVkRmlsZVplcm90aERlcHRoUGF0aCA9IG5ldyBQYXRoKGV4cGVjdGVkRmlsZU5hbWUpOwotCQotCXB1YmxpYyBJVmlydHVhbENvbnRhaW5lckFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkKLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFJlcXVpcmVtZW50cygpIHsKLQkJc3VwZXIuYXNzZXJ0UmVxdWlyZW1lbnRzKCk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiVGhlIHRhcmdldCB2aXJ0dWFsIGNvbnRhaW5lciBtdXN0IGJlIHNwZWNpZmllZC4iLCB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyKTsKLS8vCQlhc3NlcnROb3ROdWxsKCJUaGUgdGFyZ2V0IHBsYXRmb3JtIGNvbnRhaW5lciBtdXN0IGJlIHNwZWNpZmllZC4iLCB0YXJnZXRQbGF0Zm9ybUNvbnRhaW5lcik7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiVGhlIGV4cGVjdGVkIHBsYXRmb3JtIGNvbnRhaW5lciBwYXRoIG11c3QgYmUgc3BlY2lmaWVkLiIsIGV4cGVjdGVkUGxhdGZvcm1Db250YWluZXJQYXRoKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZVN0cmluZygpIHsKLQkJSVZpcnR1YWxGaWxlIHRlc3RGaWxlMXR4dCA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZ2V0RmlsZShleHBlY3RlZEZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIlRoZSB0ZXN0IGZpbGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIG11c3QgbWF0Y2guIiwgZXhwZWN0ZWRQbGF0Zm9ybUNvbnRhaW5lclBhdGguYXBwZW5kKGV4cGVjdGVkRmlsZU5hbWUpLCB0ZXN0RmlsZTF0eHQuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZVBhdGgoKSB7Ci0JCUlWaXJ0dWFsRmlsZSB0ZXN0M2pzcCA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZ2V0RmlsZShleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgpOwkJCi0JCUlQYXRoIGV4cGVjdGVkUGF0aCA9IGV4cGVjdGVkUGxhdGZvcm1Db250YWluZXJQYXRoLmFwcGVuZChleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0ZXN0IGZpbGUgcHJvamVjdCByZWxhdGl2ZSBwYXRoIG11c3QgbWF0Y2guIiwgZXhwZWN0ZWRQYXRoLCB0ZXN0M2pzcC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JfSAKLQkgCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBJVmlydHVhbEZvbGRlciBnZXRGb2xkZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRGb2xkZXJTdHJpbmcoKSB7Ci0JCUlWaXJ0dWFsRm9sZGVyIGpzcHNGb2xkZXIgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmdldEZvbGRlcihleHBlY3RlZEZvbGRlck5hbWUpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgZm9sZGVyIHNob3VsZCBub3QgYmUgbnVsbC4iLCBqc3BzRm9sZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgZm9sZGVyIHJldHVybmVkIHNob3VsZWQgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvbGRlci4iLCBleHBlY3RlZEZvbGRlck5hbWUsIGpzcHNGb2xkZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsRm9sZGVyIGdldEZvbGRlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Rm9sZGVySVBhdGgoKSB7IAotCQlJVmlydHVhbEZvbGRlciB0ZXN0R2V0Rm9sZGVyID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5nZXRGb2xkZXIoZXhwZWN0ZWRGb2xkZXJaZXJvdGhEZXB0aFBhdGgpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgZm9sZGVyIHNob3VsZCBub3QgYmUgbnVsbC4iLCB0ZXN0R2V0Rm9sZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgZm9sZGVyIHJldHVybmVkIHNob3VsZWQgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvbGRlci4iLCBleHBlY3RlZEZvbGRlclplcm90aERlcHRoUGF0aCwgdGVzdEdldEZvbGRlci5nZXRSdW50aW1lUGF0aCgpKTsJCQotCX0KLSAKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIGJvb2xlYW4gZXhpc3RzKElQYXRoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RFeGlzdHNJUGF0aCgpIHsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGV4cGVjdGVkIGZpbGUgcGF0aCBzaG91bGQgYmUgZm91bmQgdG8gZXhpc3QuIiwgdGFyZ2V0VmlydHVhbENvbnRhaW5lci5leGlzdHMoZXhwZWN0ZWRGaWxlU2luZ2xlRGVwdGhQYXRoKSk7CQkKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRNZW1iZXJTdHJpbmcoKSB7Ci0JCUlWaXJ0dWFsUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZvbGRlck5hbWUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIGZvdW5kRm9sZGVyID0gKElWaXJ0dWFsRm9sZGVyKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRm9sZGVyTmFtZSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQlmb3VuZFJlc291cmNlID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5maW5kTWVtYmVyKGV4cGVjdGVkRmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRklMRS4iLCBJVmlydHVhbFJlc291cmNlLkZJTEUsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGaWxlIGZvdW5kRmlsZSA9IChJVmlydHVhbEZpbGUpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGaWxlTmFtZSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaW5kTWVtYmVyU3RyaW5naW50KCkgewotCi0JCUlWaXJ0dWFsUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZvbGRlck5hbWUsIElWaXJ0dWFsUmVzb3VyY2UuTk9ORSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIuIiwgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGb2xkZXIgZm91bmRGb2xkZXIgPSAoSVZpcnR1YWxGb2xkZXIpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGb2xkZXJOYW1lLCBmb3VuZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCi0JCWZvdW5kUmVzb3VyY2UgPSB0YXJnZXRWaXJ0dWFsQ29udGFpbmVyLmZpbmRNZW1iZXIoZXhwZWN0ZWRGb2xkZXJOYW1lLCBJVmlydHVhbFJlc291cmNlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRklMRS4iLCBJVmlydHVhbFJlc291cmNlLkZJTEUsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGaWxlIGZvdW5kRmlsZSA9IChJVmlydHVhbEZpbGUpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGaWxlTmFtZSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOyAKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIElWaXJ0dWFsUmVzb3VyY2UgZmluZE1lbWJlcihJUGF0aCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZE1lbWJlcklQYXRoKCkgewotCi0JCUlWaXJ0dWFsUmVzb3VyY2UgZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZvbGRlclNpbmdsZURlcHRoUGF0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIuIiwgSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIsIGZvdW5kUmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQkJSVZpcnR1YWxGb2xkZXIgZm91bmRGb2xkZXIgPSAoSVZpcnR1YWxGb2xkZXIpIGZvdW5kUmVzb3VyY2U7Ci0JCWFzc2VydEVxdWFscygiVGhlIG5hbWUgc2hvdWxkIGJlIGNvcnJlY3QuIiwgZXhwZWN0ZWRGb2xkZXJTaW5nbGVEZXB0aFBhdGgubGFzdFNlZ21lbnQoKSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQlmb3VuZFJlc291cmNlID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5maW5kTWVtYmVyKGV4cGVjdGVkRmlsZVNpbmdsZURlcHRoUGF0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLiIsIElWaXJ0dWFsUmVzb3VyY2UuRklMRSwgZm91bmRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlJVmlydHVhbEZpbGUgZm91bmRGaWxlID0gKElWaXJ0dWFsRmlsZSkgZm91bmRSZXNvdXJjZTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBzaG91bGQgYmUgY29ycmVjdC4iLCBleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgubGFzdFNlZ21lbnQoKSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZSBmaW5kTWVtYmVyKElQYXRoLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZpbmRNZW1iZXJJUGF0aGludCgpIHsKLQkJSVZpcnR1YWxSZXNvdXJjZSBmb3VuZFJlc291cmNlID0gdGFyZ2V0VmlydHVhbENvbnRhaW5lci5maW5kTWVtYmVyKGV4cGVjdGVkRm9sZGVyU2luZ2xlRGVwdGhQYXRoLCBJVmlydHVhbFJlc291cmNlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIGZvdW5kIGZvciB0aGUgZXhwZWN0ZWQgZm9sZGVyIG5hbWUgc2hvdWxkIGJlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLiIsIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSLCBmb3VuZFJlc291cmNlLmdldFR5cGUoKSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIGZvdW5kRm9sZGVyID0gKElWaXJ0dWFsRm9sZGVyKSBmb3VuZFJlc291cmNlOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIHNob3VsZCBiZSBjb3JyZWN0LiIsIGV4cGVjdGVkRm9sZGVyU2luZ2xlRGVwdGhQYXRoLmxhc3RTZWdtZW50KCksIGZvdW5kUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJZm91bmRSZXNvdXJjZSA9IHRhcmdldFZpcnR1YWxDb250YWluZXIuZmluZE1lbWJlcihleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgsIElWaXJ0dWFsUmVzb3VyY2UuTk9ORSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgZm91bmQgZm9yIHRoZSBleHBlY3RlZCBmb2xkZXIgbmFtZSBzaG91bGQgYmUgSVZpcnR1YWxSZXNvdXJjZS5GSUxFLiIsIElWaXJ0dWFsUmVzb3VyY2UuRklMRSwgZm91bmRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlJVmlydHVhbEZpbGUgZm91bmRGaWxlID0gKElWaXJ0dWFsRmlsZSkgZm91bmRSZXNvdXJjZTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBzaG91bGQgYmUgY29ycmVjdC4iLCBleHBlY3RlZEZpbGVTaW5nbGVEZXB0aFBhdGgubGFzdFNlZ21lbnQoKSwgZm91bmRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLSAKLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNZW1iZXJzKCkgewotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNZW1iZXJzaW50KCkgewotCX0KLSAKLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRmlsZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGaWxlQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjM0NTI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGaWxlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsRmlsZUFQSVRlc3QgZXh0ZW5kcyBJVmlydHVhbFJlc291cmNlQVBJVGVzdCB7Ci0JCi0JcHVibGljIElWaXJ0dWFsRmlsZUFQSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsgCi0JCQotCQkKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgVmlydHVhbEZpbGUoSVByb2plY3QsIFN0cmluZywgSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxGaWxlSVByb2plY3RTdHJpbmdJUGF0aCgpIHsKLQkJCi0JfQotIAotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlKCkgeyAKLQotCQlJRmlsZSBwbGF0Zm9ybUZpbGVUb0NyZWF0ZSA9ICgoSVZpcnR1YWxGaWxlKXRhcmdldFZpcnR1YWxSZXNvdXJjZVRvQ3JlYXRlKS5nZXRVbmRlcmx5aW5nRmlsZSgpOyAKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCAhcGxhdGZvcm1GaWxlVG9DcmVhdGUuZXhpc3RzKCkgKTsgIAotCi0JCUlGaWxlIGV4aXN0aW5nUGxhdGZvcm1GaWxlID0gKChJVmlydHVhbEZpbGUpdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UpLmdldFVuZGVybHlpbmdGaWxlKCk7IAotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgbm90IGV4aXN0LiIsICFleGlzdGluZ1BsYXRmb3JtRmlsZS5leGlzdHMoKSApOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGaWxlcygpIHsgIAotCQkKLQkJSVJlc291cmNlW10gcGxhdGZvcm1GaWxlVG9DcmVhdGUgPSAoKElWaXJ0dWFsRmlsZSl0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSkuZ2V0VW5kZXJseWluZ0ZpbGVzKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHJlc291cmNlIGluIHRoZSByZXN1bHQgYXJyYXkuIiwgMSwgcGxhdGZvcm1GaWxlVG9DcmVhdGUubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggSVJlc291cmNlLkZJTEUuIiwgSVJlc291cmNlLkZJTEUsIHBsYXRmb3JtRmlsZVRvQ3JlYXRlWzBdLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIXBsYXRmb3JtRmlsZVRvQ3JlYXRlWzBdLmV4aXN0cygpICk7IAotCi0KLQkJSVJlc291cmNlW10gZXhpc3RpbmdQbGF0Zm9ybUZpbGUgPSAoKElWaXJ0dWFsRmlsZSl0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZSkuZ2V0VW5kZXJseWluZ0ZpbGVzKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIHJlc291cmNlIGluIHRoZSByZXN1bHQgYXJyYXkuIiwgMSwgZXhpc3RpbmdQbGF0Zm9ybUZpbGUubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggSVJlc291cmNlLkZJTEUuIiwgSVJlc291cmNlLkZJTEUsIGV4aXN0aW5nUGxhdGZvcm1GaWxlWzBdLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIWV4aXN0aW5nUGxhdGZvcm1GaWxlWzBdLmV4aXN0cygpICk7ICAKLQotCQlJRmlsZSBtdWx0aVBsYXRmb3JtRmlsZSA9ICgoSVZpcnR1YWxGaWxlKXRhcmdldE11bHRpVmlydHVhbFJlc291cmNlKS5nZXRVbmRlcmx5aW5nRmlsZSgpOyAKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCAhbXVsdGlQbGF0Zm9ybUZpbGUuZXhpc3RzKCkgKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsRm9sZGVyQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGZhYjcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxGb2xkZXJBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsRm9sZGVyQVBJVGVzdCBleHRlbmRzIElWaXJ0dWFsQ29udGFpbmVyQVBJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZPTERFUl9OQU1FID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJDT05URU5UX0ZPTERFUl9SRUFMX1BBVEggPSBuZXcgUGF0aCgiL1dlYk1vZHVsZTEvV2ViQ29udGVudC8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggV0VCSU5GX0ZPTERFUl9SRUFMX1BBVEggPSBXRUJDT05URU5UX0ZPTERFUl9SRUFMX1BBVEguYXBwZW5kKFRFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iK1RFU1RfRk9MREVSX05BTUUpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIID0gbmV3IFBhdGgoIldlYk1vZHVsZTEvdGVzdGRhdGEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIERFTEVURU1FX1BBVEggPSBuZXcgUGF0aCgiL2RlbGV0ZW1lIik7IC8vJE5PTi1OTFMtMSQgCi0KLQlwdWJsaWMgSVZpcnR1YWxGb2xkZXJBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0gCi0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IAotCQkKLQkJZXhwZWN0ZWRQbGF0Zm9ybUNvbnRhaW5lclBhdGggPSBURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIOwotCQkKLQkJZXhwZWN0ZWRSdW50aW1lUGF0aCA9IFdFQklORl9GT0xERVJfUlVOVElNRV9QQVRIOwotCQlleHBlY3RlZE5hbWUgPSBURVNUX0ZPTERFUl9OQU1FOwotCQlleHBlY3RlZFByb2plY3QgPSBUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVDsKLQkJCi0JCXRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZSA9IFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZvbGRlcihXRUJJTkZfRk9MREVSX1JFQUxfUEFUSCk7Ci0JCQotCQkvL3ZpcnR1YWxQYXJlbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVCwgVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFXzFfTkFNRSk7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVCk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQl2aXJ0dWFsUGFyZW50ID0gcm9vdEZvbGRlcjsKLQkJCi0JCXRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlID0gdmlydHVhbFBhcmVudC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEgpOyAJCQotCi0JCXRhcmdldFZpcnR1YWxDb250YWluZXIgPSB2aXJ0dWFsUGFyZW50LmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUlVOVElNRV9QQVRIKTsgCi0JCXRhcmdldFBsYXRmb3JtQ29udGFpbmVyID0gVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFRFU1REQVRBX0ZPTERFUl9SRUFMX1BBVEgpOwotCQkKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUgPSB2aXJ0dWFsUGFyZW50LmdldEZvbGRlcihERUxFVEVNRV9QQVRIKTsKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuY3JlYXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJdGFyZ2V0UGxhdGZvcm1SZXNvdXJjZVRvRGVsZXRlID0gZXhwZWN0ZWRQcm9qZWN0LmdldEZvbGRlcih0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwkJCQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJCi0JCWlmKHRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZS5leGlzdHMoKSkKLQkJCXRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZS5kZWxldGUoSVZpcnR1YWxSZXNvdXJjZS5GT1JDRSwgbnVsbCk7IAotCX0gIAotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuZGVybHlpbmdGb2xkZXIoKSB7IAotCQlJQ29udGFpbmVyIHVuZGVybHlpbmdSZXNvdXJjZSAgPSAoKElWaXJ0dWFsRm9sZGVyKXRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7CQkKLQkJSUNvbnRhaW5lciBleHBlY3RlZFBsYXRmb3JtUmVzb3VyY2UgPSBUZXN0V29ya3NwYWNlLlRFU1RfUFJPSkVDVC5nZXRGb2xkZXIoV0VCSU5GX0ZPTERFUl9SVU5USU1FX1BBVEgpOwkJCi0JCWFzc2VydEVxdWFscygiVGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIGJlICIgK2V4cGVjdGVkUGxhdGZvcm1SZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCksIGV4cGVjdGVkUGxhdGZvcm1SZXNvdXJjZSwgdW5kZXJseWluZ1Jlc291cmNlKTsgLy8kTk9OLU5MUy0xJAkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5kZXJseWluZ0ZvbGRlcnMoKSB7IAotCi0JCUlDb250YWluZXJbXSB1bmRlcmx5aW5nUmVzb3VyY2VzICA9ICgoSVZpcnR1YWxGb2xkZXIpdGFyZ2V0VmlydHVhbENvbnRhaW5lcikuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgdHdvIGZvbGRlcnMgbWFwcGVkIHRvIHJvb3QiLCAyLCB1bmRlcmx5aW5nUmVzb3VyY2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVNldCB1bmRlcmx5aW5nUmVzb3VyY2VzU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCh1bmRlcmx5aW5nUmVzb3VyY2VzKSk7Ci0JCVNldCBleHBlY3RlZFVuZGVybHlpbmdSZXNvdXJjZXNTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlleHBlY3RlZFVuZGVybHlpbmdSZXNvdXJjZXNTZXQuYWRkKFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZvbGRlcihURVNUREFUQV9GT0xERVJfUkVBTF9QQVRIKSk7Ci0JCWV4cGVjdGVkVW5kZXJseWluZ1Jlc291cmNlc1NldC5hZGQoVGVzdFdvcmtzcGFjZS5URVNUX1BST0pFQ1QuZ2V0Rm9sZGVyKFdFQkNPTlRFTlRfRk9MREVSX1JFQUxfUEFUSCkpOwotCQlhc3NlcnRFcXVhbHMoIkV4cGVjdGluZyB0d28gZm9sZGVycyBtYXBwZWQgdG8gcm9vdC4iICtleHBlY3RlZFVuZGVybHlpbmdSZXNvdXJjZXNTZXQsIHVuZGVybHlpbmdSZXNvdXJjZXNTZXQpOyAvLyROT04tTkxTLTEkCQotCi0JfQotCSAKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvSVZpcnR1YWxSZWZlcmVuY2VBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTE1ZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlZmVyZW5jZUFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIElWaXJ0dWFsUmVmZXJlbmNlQVBJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlKCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlyZWZlcmVuY2UuY3JlYXRlKDAsbnVsbCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSdW50aW1lUGF0aCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJcmVmZXJlbmNlLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lUGF0aCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJSVBhdGggcGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZXBlbmRlbmN5VHlwZSgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJaW50IGRlcGVuZGVuY3lUeXBlID0gMDsKLQkJcmVmZXJlbmNlLnNldERlcGVuZGVuY3lUeXBlKGRlcGVuZGVuY3lUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwZW5kZW5jeVR5cGUoKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG5ldyBWaXJ0dWFsUmVmZXJlbmNlKCk7Ci0JCWludCBkZXBlbmRlbmN5VHlwZSA9IDA7Ci0JCWRlcGVuZGVuY3lUeXBlID0gcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4aXN0cygpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJYm9vbGVhbiBleGlzdHMgPSByZWZlcmVuY2UuZXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVuY2xvc2luZ0NvbXBvbmVudCgpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFZpcnR1YWxSZWZlcmVuY2UoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gcmVmZXJlbmNlLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgewotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVmlydHVhbFJlZmVyZW5jZSgpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsUmVzb3VyY2VBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL0lWaXJ0dWFsUmVzb3VyY2VBUElUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZmFjNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9JVmlydHVhbFJlc291cmNlQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudmlydHVhbHBhdGgudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElWaXJ0dWFsUmVzb3VyY2VBUElUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByb3RlY3RlZCBJVmlydHVhbENvbnRhaW5lciB2aXJ0dWFsUGFyZW50OwkKLQlwcm90ZWN0ZWQgSVZpcnR1YWxSZXNvdXJjZSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgSVJlc291cmNlIHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZTsKLQkgIAotCXByb3RlY3RlZCBJVmlydHVhbEZvbGRlciB0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgSVJlc291cmNlIHRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZTsJIAotCQkKLQlwcm90ZWN0ZWQgSVZpcnR1YWxSZXNvdXJjZSB0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElWaXJ0dWFsUmVzb3VyY2UgdGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UgPSBudWxsOyAKLQkKLQlwcm90ZWN0ZWQgSVByb2plY3QgZXhwZWN0ZWRQcm9qZWN0OwkKLQlwcm90ZWN0ZWQgSVBhdGggZXhwZWN0ZWRSdW50aW1lUGF0aDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4cGVjdGVkTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSBudWxsOwotCi0JcHVibGljIElWaXJ0dWFsUmVzb3VyY2VBUElUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0gIAotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlUZXN0V29ya3NwYWNlLmluaXQoKTsKLQkJZG9TZXR1cCgpOwotCQlhc3NlcnRSZXF1aXJlbWVudHMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVxdWlyZW1lbnRzKCkgeyAKLQkJCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TZXR1cCgpIHRocm93cyBFeGNlcHRpb24gOwotCi0JLy9UT0RPOiBUaGlzIHRlc3QgZmFpbHMgaW50ZXJtaXR0ZW50bHkgKEJ1ZyAxNzUyODYpLAotCS8vd2FpdGluZyBmb3IgYnVnIDIwODA5MyB0byBiZSByZXNvbHZlZCBiZWZvcmUgaW52ZXN0aWdhdGluZyBmdXJ0aGVyCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUxpbmtJUGF0aGludElQcm9ncmVzc01vbml0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCksIFRlc3RXb3Jrc3BhY2UuV0VCX01PRFVMRV8yX05BTUUpOwotCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCi0JCUlWaXJ0dWFsRm9sZGVyIGltYWdlcyA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKG5ldyBQYXRoKCIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCQkKLQkJaW1hZ2VzLmNyZWF0ZUxpbmsobmV3IFBhdGgoIi9XZWJNb2R1bGUyL2ltYWdlcyIpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlGb2xkZXIgcmVhbEltYWdlcyA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldEZvbGRlcihuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIlRoZSAvV2ViQ29udGVudDIvaW1hZ2VzIGRpcmVjdG9yeSBtdXN0IGV4aXN0LiIsIHJlYWxJbWFnZXMuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0KLQkJCUNvbXBvbmVudFJlc291cmNlW10gY29tcG9uZW50UmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgobmV3IFBhdGgoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBtYXBwaW5nIGZvciB2aXJ0dWFsIHBhdGggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzLmxlbmd0aCA+IDApOyAvLyROT04tTkxTLTEkCi0KLQkJCVJlc291cmNlVHJlZVJvb3QgcmVzb3VyY2VUcmVlUm9vdCA9IFJlc291cmNlVHJlZVJvb3QuZ2V0U291cmNlUmVzb3VyY2VUcmVlUm9vdCh3YkNvbXBvbmVudCk7Ci0JCQljb21wb25lbnRSZXNvdXJjZXMgPSByZXNvdXJjZVRyZWVSb290LmZpbmRNb2R1bGVSZXNvdXJjZXMocmVhbEltYWdlcy5nZXRGdWxsUGF0aCgpLCBSZXNvdXJjZVRyZWVOb2RlLkNSRUFURV9OT05FKTsKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIENvbXBvbmVudCByZXNvdXJjZSB3aXRoIHRoZSBzb3VyY2UgcGF0aCBcIiIgKyByZWFsSW1hZ2VzLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSArICJcIi4iLCBjb21wb25lbnRSZXNvdXJjZXMubGVuZ3RoID09IDEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJ1bnRpbWUgcGF0aCBzaG91bGQgbWF0Y2ggXCIvaW1hZ2VzXCIuIiwgY29tcG9uZW50UmVzb3VyY2VzWzBdLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi9pbWFnZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBtYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBjb21wb25lbnQgcmVzb3VyY2UgaXMgY3JlYXRlZAotCi0JCQlpbWFnZXMuY3JlYXRlTGluayhuZXcgUGF0aCgiL1dlYk1vZHVsZTIvaW1hZ2VzIiksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJCWNvbXBvbmVudFJlc291cmNlcyA9IHJlc291cmNlVHJlZVJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhyZWFsSW1hZ2VzLmdldEZ1bGxQYXRoKCksIFJlc291cmNlVHJlZU5vZGUuQ1JFQVRFX05PTkUpOwotCi0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgQ29tcG9uZW50IHJlc291cmNlIHdpdGggdGhlIHNvdXJjZSBwYXRoIFwiIiArIHJlYWxJbWFnZXMuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpICsgIlwiLiIsIGNvbXBvbmVudFJlc291cmNlcy5sZW5ndGggPT0gMSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlhc3NlcnRUcnVlKCJUaGUgcnVudGltZSBwYXRoIHNob3VsZCBtYXRjaCBcIi9pbWFnZXNcIi4iLCBjb21wb25lbnRSZXNvdXJjZXNbMF0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiL2ltYWdlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlhc3NlcnRUcnVlKCJUaGUgZXhpc3RpbmcgdmlydHVhbCByZXNvdXJjZSBzaG91bGQgaGF2ZSBubyBmaWxlIGV4dGVuc2lvbi4iLCB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCkgewotCQlJUGF0aCByZWFsUGF0aCA9IHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQlJUGF0aCB2aXJ0dWFsUGF0aCA9IHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSB7Ci0JCUlQYXRoIHJlYWxQYXRoID0gdGFyZ2V0RXhpc3RpbmdQbGF0Zm9ybVJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJSVBhdGggdmlydHVhbFBhdGggPSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3QgcmVsYXRpdmUgcGF0aCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSByZWFsIHJlc291cmNlIiwgcmVhbFBhdGgsIHZpcnR1YWxQYXRoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSdW50aW1lUGF0aCgpIHsgCi0JCUlQYXRoIHZpcnR1YWxQYXRoID0gdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0UnVudGltZVBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcnVudGltZSBwYXRoIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHJlYWwgcmVzb3VyY2UiLCBleHBlY3RlZFJ1bnRpbWVQYXRoLCB2aXJ0dWFsUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgbmFtZSBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSBleHBlY3RlZCBuYW1lLiIsIGV4cGVjdGVkTmFtZSwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQYXJlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHBhcmVudCBvZiB0aGUgdmlydHVhbCByZXNvdXJjZSBtdXN0IG1hdGNoIHRoZSBjb21wb25lbnQuIiwgdmlydHVhbFBhcmVudCwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0UGFyZW50KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb2plY3QoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHByb2plY3Qgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdGVzdCBwcm9qZWN0LiIsIGV4cGVjdGVkUHJvamVjdCwgdGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsgLy8kTk9OLU5MUy0xJAotCX0gIAotCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHZpcnR1YWwgcmVzb3VyY2UgbXVzdCBtYXRjaCB0aGUgdGVzdCBwcm9qZWN0LiIsIElSZXNvdXJjZS5GT0xERVIsIHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudCgpIHsgCi0JCWFzc2VydEVxdWFscygiVGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSB2aXJ0dWFsIHJlc291cmNlIG11c3QgbWF0Y2ggdGhlIHRlc3QgcHJvamVjdC4iLCBUZXN0V29ya3NwYWNlLldFQl9NT0RVTEVfMV9OQU1FLCB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRDb21wb25lbnQoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzQWNjZXNzaWJsZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgcGxhdGZvcm0gcmVzb3VyY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUgb25seSBpZiB0aGUgdmlydHVhbCByZXNvdXJjZSBpcyBhY2Nlc3NpYmxlLiIsIHRhcmdldEV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZS5pc0FjY2Vzc2libGUoKSwgdGFyZ2V0RXhpc3RpbmdQbGF0Zm9ybVJlc291cmNlLmlzQWNjZXNzaWJsZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0gCi0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlaW50SVByb2dyZXNzTW9uaXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZS5kZWxldGUoMCwgbnVsbCk7Ci0JCQotCQlhc3NlcnRUcnVlKCJUaGUgcmVhbCBmb2xkZXIgc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBJVmlydHVhbFJlc291cmNlLkRFTEVURV9NRVRBTU9ERUxfT05MWSBpcyBOT1Qgc3VwcGxpZWQuIiwgIXRhcmdldFBsYXRmb3JtUmVzb3VyY2VUb0RlbGV0ZS5leGlzdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMgPSB2aXJ0dWFsUGFyZW50Lm1lbWJlcnMoKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaWYobWVtYmVyc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0RlbGV0ZS5nZXRSdW50aW1lUGF0aCgpKSkgewotCQkJCWZhaWwoIkZvdW5kIGRlbGV0ZWQgZm9sZGVyIGluIG1lbWJlcnMoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGludCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlaW50SVByb2dyZXNzTW9uaXRvcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuSUdOT1JFX1VOREVSTFlJTkdfUkVTT1VSQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgcmVzb3VyY2Ugc2hvdWxkIG5vdCBiZSBkZWxldGVkIHdoZW4gSVZpcnR1YWxSZXNvdXJjZS5JR05PUkVfVU5ERVJMWUlOR19SRVNPVVJDRSBpcyBzdXBwbGllZC4iLCB0YXJnZXRQbGF0Zm9ybVJlc291cmNlVG9EZWxldGUuZXhpc3RzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCS8vIG9ubHkgaGFuZGxlcyBleHBsaWNpdCBtYXBwaW5ncwotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgeyAKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShleHBlY3RlZFByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCUNvbXBvbmVudFJlc291cmNlW10gcmVzb3VyY2VzID0gd2JDb21wb25lbnQuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgodGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZ2V0UnVudGltZVBhdGgoKSk7Ci0JCQlhc3NlcnRUcnVlKCJUaGVyZSBzaG91bGQgYmUgbm8gbWF0Y2hpbmcgcmVzb3VyY2VzIGZvdW5kIGluIHRoZSBtb2RlbC4iLCByZXNvdXJjZXMubGVuZ3RoID09IDApOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgZGVsZXRlKGJvb2xlYW4sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZWludElQcm9ncmVzc01vbml0b3IzKCkgIHRocm93cyBFeGNlcHRpb24gIHsKLQkJdGFyZ2V0VmlydHVhbFJlc291cmNlVG9EZWxldGUuZGVsZXRlKElWaXJ0dWFsUmVzb3VyY2UuRk9SQ0UsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlYWwgcmVzb3VyY2Ugc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBJVmlydHVhbFJlc291cmNlLklHTk9SRV9VTkRFUkxZSU5HX1JFU09VUkNFIGlzIE5PVCBzdXBwbGllZC4iLCAhdGFyZ2V0UGxhdGZvcm1SZXNvdXJjZVRvRGVsZXRlLmV4aXN0cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQotCQlJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyA9IHZpcnR1YWxQYXJlbnQubWVtYmVycygpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihtZW1iZXJzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKHRhcmdldFZpcnR1YWxSZXNvdXJjZVRvRGVsZXRlLmdldFJ1bnRpbWVQYXRoKCkpKSB7Ci0JCQkJZmFpbCgiRm91bmQgZGVsZXRlZCBmb2xkZXIgaW4gbWVtYmVycygpIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQkKLQl9CQotCSAKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSBwbGF0Zm9ybVJlc291cmNlVG9DcmVhdGUgPSB0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJaW50IGV4cGVjdGVkVHlwZSA9IGRldGVybWluZUV4cGVjdGVkVHlwZSh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZSk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgcGxhdGZvcm1SZXNvdXJjZVRvQ3JlYXRlLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBub3QgZXhpc3QuIiwgIXBsYXRmb3JtUmVzb3VyY2VUb0NyZWF0ZS5leGlzdHMoKSApOyAgCi0JCQotCQlleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0RXhpc3RpbmdWaXJ0dWFsUmVzb3VyY2UpOwotCQlJUmVzb3VyY2UgZXhpdGluZ1BsYXRmb3JtUmVzb3VyY2UgPSB0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGUuIiwgZXhwZWN0ZWRUeXBlLCBleGl0aW5nUGxhdGZvcm1SZXNvdXJjZS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgZXhpc3QuIiwgZXhpdGluZ1BsYXRmb3JtUmVzb3VyY2UuZXhpc3RzKCkgKTsKLQkJCi0JCQotCQlleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UpOwotCQlJUmVzb3VyY2UgbXVsdGlQbGF0Zm9ybVJlc291cmNlID0gdGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgbXVsdGlQbGF0Zm9ybVJlc291cmNlLmdldFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSB1bmRlcnlsaW5nIHJlc291cmNlIHNob3VsZCBleGlzdC4iLCBtdWx0aVBsYXRmb3JtUmVzb3VyY2UuZXhpc3RzKCkgKTsgCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmRlcmx5aW5nUmVzb3VyY2VzKCkgeyAKLQotCQlpbnQgZXhwZWN0ZWRUeXBlID0gZGV0ZXJtaW5lRXhwZWN0ZWRUeXBlKHRhcmdldFZpcnR1YWxSZXNvdXJjZVRvQ3JlYXRlKTsKLQkJSVJlc291cmNlW10gcGxhdGZvcm1SZXNvdXJjZXNUb0NyZWF0ZSA9IHRhcmdldFZpcnR1YWxSZXNvdXJjZVRvQ3JlYXRlLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgcmVzb3VyY2UgaW4gdGhlIHJlc3VsdCBhcnJheS4iLCAxLCBwbGF0Zm9ybVJlc291cmNlc1RvQ3JlYXRlLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2Ugc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlLiIsIGV4cGVjdGVkVHlwZSwgcGxhdGZvcm1SZXNvdXJjZXNUb0NyZWF0ZVswXS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgdW5kZXJ5bGluZyByZXNvdXJjZSBzaG91bGQgbm90IGV4aXN0LiIsICFwbGF0Zm9ybVJlc291cmNlc1RvQ3JlYXRlWzBdLmV4aXN0cygpICk7IAotCi0JCWV4cGVjdGVkVHlwZSA9IGRldGVybWluZUV4cGVjdGVkVHlwZSh0YXJnZXRFeGlzdGluZ1ZpcnR1YWxSZXNvdXJjZSk7Ci0JCUlSZXNvdXJjZVtdIGV4aXN0aW5nUGxhdGZvcm1SZXNvdXJjZSA9IHRhcmdldEV4aXN0aW5nVmlydHVhbFJlc291cmNlLmdldFVuZGVybHlpbmdSZXNvdXJjZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgb25seSBiZSBvbmUgcmVzb3VyY2UgaW4gdGhlIHJlc3VsdCBhcnJheS4iLCAxLCBleGlzdGluZ1BsYXRmb3JtUmVzb3VyY2UubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGUuIiwgZXhwZWN0ZWRUeXBlLCBleGlzdGluZ1BsYXRmb3JtUmVzb3VyY2VbMF0uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCBleGlzdGluZ1BsYXRmb3JtUmVzb3VyY2VbMF0uZXhpc3RzKCkgKTsgIAotCi0JCQotCQlleHBlY3RlZFR5cGUgPSBkZXRlcm1pbmVFeHBlY3RlZFR5cGUodGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UpOwotCQlJUmVzb3VyY2VbXSBtdWx0aVBsYXRmb3JtUmVzb3VyY2VzID0gdGFyZ2V0TXVsdGlWaXJ0dWFsUmVzb3VyY2UuZ2V0VW5kZXJseWluZ1Jlc291cmNlcygpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZS4iLCBleHBlY3RlZFR5cGUsIG11bHRpUGxhdGZvcm1SZXNvdXJjZXNbMF0uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHVuZGVyeWxpbmcgcmVzb3VyY2Ugc2hvdWxkIG5vdCBleGlzdC4iLCBtdWx0aVBsYXRmb3JtUmVzb3VyY2VzWzBdLmV4aXN0cygpICk7IAotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZUV4cGVjdGVkVHlwZShJVmlydHVhbFJlc291cmNlIGFWaXJ0dWFsUmVzb3VyY2UpIHsgCi0JCXN3aXRjaCh0YXJnZXRWaXJ0dWFsUmVzb3VyY2VUb0NyZWF0ZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVZpcnR1YWxSZXNvdXJjZS5GSUxFOgotCQkJCXJldHVybiBJUmVzb3VyY2UuRklMRTsgCi0JCQljYXNlIElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSOgotCQkJY2FzZSBJVmlydHVhbFJlc291cmNlLkNPTVBPTkVOVDoKLQkJCQlyZXR1cm4gSVJlc291cmNlLkZPTERFUjsgCi0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL1N0cnVjdHVyZUVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9jb21wb25lbnRjb3JlL3ZpcnR1YWxwYXRoL3Rlc3RzL1N0cnVjdHVyZUVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNjRmMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9TdHJ1Y3R1cmVFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS52aXJ0dWFscGF0aC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBhUmVzb3VyY2U7Ci0KLQlwdWJsaWMgU3RydWN0dXJlRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVRlc3RXb3Jrc3BhY2UuaW5pdCgpOwotCQlhUmVzb3VyY2U9IFRlc3RXb3Jrc3BhY2UuVEVTVF9QUk9KRUNULmdldEZpbGUobmV3IFBhdGgoIldlYk1vZHVsZTEvdGVzdGRhdGEvVGVzdEZpbGUxLnR4dCIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbmRCeVNvdXJjZVBhdGgoKSB7IAotCQlJUHJvamVjdCBwcm9qID0gYVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJU3RydWN0dXJlRWRpdCBzZSA9IG51bGw7Ci0JCUxpc3QgZm91bmRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvaik7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHNlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoIlRoZXJlIHNob3VsZCBiZSBvbmUgcmVzb3VyY2UgZm91bmQuIiwgMSwgcmVzb3VyY2VzLmxlbmd0aCk7Ci0KLQkJCXJlc291cmNlcyA9IHNlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgoYVJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJUaGVyZSBzaG91bGQgYmUgb25lIHJlc291cmNlIGZvdW5kLiIsIDEsIHJlc291cmNlcy5sZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJIGZpbmFsbHkgewotCQkJc2UuZGlzcG9zZSgpOwkKLQkJfSAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2NvbXBvbmVudGNvcmUvdmlydHVhbHBhdGgvdGVzdHMvVGVzdFdvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmU1NDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvY29tcG9uZW50Y29yZS92aXJ0dWFscGF0aC90ZXN0cy9UZXN0V29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5jb21wb25lbnRjb3JlLnZpcnR1YWxwYXRoLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHMuUHJvamVjdFVuemlwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFdvcmtzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiV2ViTW9kdWxlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFXzFfTkFNRSA9ICJXZWJNb2R1bGUxIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9NT0RVTEVfMl9OQU1FID0gIldlYk1vZHVsZTIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dFQl9NT0RVTEVfTkFNRSA9ICJUZXN0VmlydHVhbEFQSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkYgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoInRlc3REYXRhL1Rlc3RWaXJ0dWFsQVBJLnppcCIpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3QgVEVTVF9QUk9KRUNUID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuUFJPSkVDVF9OQU1FKTsKLQkgIAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1PRFVMRV9OQU1FUyA9IG5ldyBTdHJpbmdbXXsiV2ViTW9kdWxlMSIsICJXZWJNb2R1bGUyIn07ICAKLQkKLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJCi0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QuZXhpc3RzKCkpCi0JCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQljcmVhdGVQcm9qZWN0KCk7IAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjcmVhdGVQcm9qZWN0KCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBuZXcgU3RyaW5nW117UFJPSkVDVF9OQU1FfSk7Ci0JCXJldHVybiB1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQlVUkwgdXJsID0gQ29tbW9uVGVzdHNQbHVnaW4uaW5zdGFuY2UuZmluZCh6aXBGaWxlUGF0aCk7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjAxOTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEEgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIkEuUCI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTVmOTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIkIuUCI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9DLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzA4NTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEMgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIkMuUCI7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEFQSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvRGF0YU1vZGVsQVBJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1YjdjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvRGF0YU1vZGVsQVBJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRXh0ZW5kZWRPcGVyYXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsQVBJVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbEFQSVRlc3RzKCk7Ci0JfQotCi0JcHVibGljIERhdGFNb2RlbEFQSVRlc3RzKCkgewotCQlzdXBlcigpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRXZlbnRUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShOZXN0aW5nVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoTmVzdGVkTGlzdGVuaW5nVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoU2ltcGxlRGF0YU1vZGVsVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRGF0YU1vZGVsRmFjdG9yeVRlc3QuY2xhc3MpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKERhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShUZXN0QWJzdHJhY3RETVByb3ZpZGVyLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShWYWxpZGF0aW9uVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5jbGFzcykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxFbmFibGVtZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Nzc3Y2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0RhdGFNb2RlbEVuYWJsZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQuRGF0YU1vZGVsRW5hYmxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTW9kZWxFbmFibGVtZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZEV4dGVuc2lvbklEQW5kUHJvdmlkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoInRlbXAiKTsKLQkJaWYgKHByb2ogPT0gbnVsbCkgewotCQkJcHJvai5jcmVhdGUobnVsbCk7Ci0JCX0KLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxFbmFibGVtZW50RmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoInRlc3RQcm92aWRlckJhc2UiLCBwcm9qKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JREltcGxlbWVudG9yRm9yUHJvdmlkZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJSVByb2plY3QgcHJvaiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgidGVtcCIpOwotCQlpZiAocHJvaiA9PSBudWxsKSB7Ci0JCQlwcm9qLmNyZWF0ZShudWxsKTsKLQkJfQotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEVuYWJsZW1lbnRGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgidGVzdFByb3ZpZGVyQm9ndXMiLCBwcm9qKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwgPT0gbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvRGF0YU1vZGVsRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTgwZjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9EYXRhTW9kZWxGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0V4dGVuc2lvbigpIHsKLQkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRhdGFNb2RlbCAgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgiYm9ndXMiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRXh0ZW5zaW9uSUQoKSB7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbCgiYmFkSUQiKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoT2JqZWN0LmNsYXNzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0KLQkJYXNzZXJ0TnVsbChkYXRhTW9kZWwpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRFeHRlbnNpb25JREFuZFByb3ZpZGVyVHlwZSgpIHsKLSAgICAgICAgU3RyaW5nW10gZGVzY3MgPSBEYXRhTW9kZWxGYWN0b3J5LmdldERhdGFNb2RlbFByb3ZpZGVySURzRm9yS2luZCgidGVzdFByb3ZpZGVyQmFzZSIpOwotICAgICAgICBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGRlc2NzWzBdKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uSUQoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoIm9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eShJVGVzdERhdGFNb2RlbC5GT08pKTsKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkRXh0ZW5zaW9uQ2xhc3MoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVRlc3REYXRhTW9kZWwuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5KElUZXN0RGF0YU1vZGVsLkZPTykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZEV4dGVuc2lvbkluc3RhbmNlKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBUZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHkoSVRlc3REYXRhTW9kZWwuRk9PKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0V2ZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0V2ZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTgzODcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9FdmVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRXZlbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50Q3JlYXRpb24oKSB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQSgpKTsKLQkJZG0uc2V0UHJvcGVydHkoQS5QLCAiYWFhIik7Ci0JCURhdGFNb2RlbEV2ZW50IGV2ZW50ID0gbmV3IERhdGFNb2RlbEV2ZW50KGRtLCBBLlAsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCWFzc2VydEVxdWFscyhkbSwgZXZlbnQuZ2V0RGF0YU1vZGVsKCkpOwotCQlhc3NlcnRFcXVhbHMoQS5QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWRtLnNldFByb3BlcnR5KEEuUCwgImJiYiIpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQlldmVudCA9IG5ldyBEYXRhTW9kZWxFdmVudChkbSwgQS5QLCBEYXRhTW9kZWxFdmVudC5FTkFCTEVfQ0hHKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscyhkbS5pc1Byb3BlcnR5RW5hYmxlZChBLlApLCBldmVudC5pc1Byb3BlcnR5RW5hYmxlZCgpKTsKLQkJZXZlbnQgPSBuZXcgRGF0YU1vZGVsRXZlbnQoZG0sIEEuUCwgRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9PcGVyYXRpb25FeHRlbnNpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q5ODdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb09wZXJhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSGVsbG9PcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBleGVjdXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZWRvIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB1bmRvIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNDkwOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9Qb3N0T3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotcHVibGljIGNsYXNzIEhlbGxvUG9zdE9wZXJhdGlvbkV4dGVuc2lvbiBleHRlbmRzIEhlbGxvT3BlcmF0aW9uRXh0ZW5zaW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0hlbGxvUHJlT3BlcmF0aW9uRXh0ZW5zaW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmM2M4NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSGVsbG9QcmVPcGVyYXRpb25FeHRlbnNpb24gZXh0ZW5kcyBIZWxsb09wZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9JVGVzdERhdGFNb2RlbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0lUZXN0RGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODBmMmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL0lUZXN0RGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotcHVibGljIGludGVyZmFjZSBJVGVzdERhdGFNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT08gPSAiSVRlc3REYXRhTW9kZWwuRk9PIjsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL05lc3RlZExpc3RlbmluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0ZWRMaXN0ZW5pbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTc0ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL05lc3RlZExpc3RlbmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmVzdGVkTGlzdGVuaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcnMxKCkgewotCQlUZXN0TGlzdGVuZXIgYUwgPSBuZXcgVGVzdExpc3RlbmVyKCk7Ci0JCVRlc3RMaXN0ZW5lciBiTCA9IG5ldyBUZXN0TGlzdGVuZXIoKTsKLQkJVGVzdExpc3RlbmVyIGNMID0gbmV3IFRlc3RMaXN0ZW5lcigpOwotCi0JCUlEYXRhTW9kZWwgYSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBKCkpOwotCQlJRGF0YU1vZGVsIGIgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQigpKTsKLQkJSURhdGFNb2RlbCBjID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSk7Ci0JCWEuYWRkTGlzdGVuZXIoYUwpOwotCQliLmFkZExpc3RlbmVyKGJMKTsKLQkJYy5hZGRMaXN0ZW5lcihjTCk7Ci0KLQkJLy8gY3lsaWNhbAotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7Ci0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsKLQkJYy5hZGROZXN0ZWRNb2RlbCgiYSIsIGEpOwotCQlhTC5jbGVhckV2ZW50cygpOwotCQliTC5jbGVhckV2ZW50cygpOwotCQljTC5jbGVhckV2ZW50cygpOwotCQlhLnNldFByb3BlcnR5KEEuUCwgImEiKTsKLQkJYi5zZXRQcm9wZXJ0eShCLlAsICJiIik7Ci0JCWMuc2V0UHJvcGVydHkoQy5QLCAiYyIpOwotCQlMaXN0IGFFdmVudHMgPSBhTC5nZXRFdmVudHMoKTsKLQkJTGlzdCBiRXZlbnRzID0gYkwuZ2V0RXZlbnRzKCk7Ci0JCUxpc3QgY0V2ZW50cyA9IGNMLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMywgYUV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYkV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY0V2ZW50cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJRGF0YU1vZGVsRXZlbnQgYUV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBhRXZlbnRzLmdldChpKTsKLQkJCURhdGFNb2RlbEV2ZW50IGJFdmVudCA9IChEYXRhTW9kZWxFdmVudCkgYkV2ZW50cy5nZXQoaSk7Ci0JCQlEYXRhTW9kZWxFdmVudCBjRXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGNFdmVudHMuZ2V0KGkpOwotCi0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGFFdmVudC5nZXREYXRhTW9kZWwoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RGF0YU1vZGVsKCksIGRhdGFNb2RlbCk7Ci0JCQlhc3NlcnRFcXVhbHMoY0V2ZW50LmdldERhdGFNb2RlbCgpLCBkYXRhTW9kZWwpOwotCi0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gYUV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJYXNzZXJ0RXF1YWxzKGJFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5TmFtZSk7Ci0KLQkJCWludCBmbGFnID0gYUV2ZW50LmdldEZsYWcoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQotCQkJT2JqZWN0IHByb3BlcnR5ID0gYUV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlhc3NlcnRFcXVhbHMoYkV2ZW50LmdldFByb3BlcnR5KCksIHByb3BlcnR5KTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHkpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGEsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBBLlApOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHksICJhIik7Ci0JCQkJCWFzc2VydFRydWUoZGF0YU1vZGVsLmlzUHJvcGVydHlTZXQocHJvcGVydHlOYW1lKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWFzc2VydEVxdWFscyhiLCBkYXRhTW9kZWwpOwotCQkJCQlhc3NlcnRFcXVhbHMoZmxhZywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5TmFtZSwgQi5QKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5LCAiYiIpOwotCQkJCQlhc3NlcnRUcnVlKGRhdGFNb2RlbC5pc1Byb3BlcnR5U2V0KHByb3BlcnR5TmFtZSkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQlhc3NlcnRFcXVhbHMoYywgZGF0YU1vZGVsKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKGZsYWcsIERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyk7Ci0JCQkJCWFzc2VydEVxdWFscyhwcm9wZXJ0eU5hbWUsIEMuUCk7Ci0JCQkJCWFzc2VydEVxdWFscyhwcm9wZXJ0eSwgImMiKTsKLQkJCQkJYXNzZXJ0VHJ1ZShkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhTC5jbGVhckV2ZW50cygpOwotCQliTC5jbGVhckV2ZW50cygpOwotCQljTC5jbGVhckV2ZW50cygpOwotCQlhLnNldFByb3BlcnR5KEEuUCwgbnVsbCk7Ci0JCWIuc2V0UHJvcGVydHkoQi5QLCBudWxsKTsKLQkJYy5zZXRQcm9wZXJ0eShDLlAsIG51bGwpOwotCQlhRXZlbnRzID0gYUwuZ2V0RXZlbnRzKCk7Ci0JCWJFdmVudHMgPSBiTC5nZXRFdmVudHMoKTsKLQkJY0V2ZW50cyA9IGNMLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMywgYUV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYkV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY0V2ZW50cy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJRGF0YU1vZGVsRXZlbnQgYUV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBhRXZlbnRzLmdldChpKTsKLQkJCURhdGFNb2RlbEV2ZW50IGJFdmVudCA9IChEYXRhTW9kZWxFdmVudCkgYkV2ZW50cy5nZXQoaSk7Ci0JCQlEYXRhTW9kZWxFdmVudCBjRXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGNFdmVudHMuZ2V0KGkpOwotCi0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGFFdmVudC5nZXREYXRhTW9kZWwoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RGF0YU1vZGVsKCksIGRhdGFNb2RlbCk7Ci0JCQlhc3NlcnRFcXVhbHMoY0V2ZW50LmdldERhdGFNb2RlbCgpLCBkYXRhTW9kZWwpOwotCi0JCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gYUV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJYXNzZXJ0RXF1YWxzKGJFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5TmFtZSk7Ci0KLQkJCWludCBmbGFnID0gYUV2ZW50LmdldEZsYWcoKTsKLQkJCWFzc2VydEVxdWFscyhiRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0RmxhZygpLCBmbGFnKTsKLQotCQkJT2JqZWN0IHByb3BlcnR5ID0gYUV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlhc3NlcnRFcXVhbHMoYkV2ZW50LmdldFByb3BlcnR5KCksIHByb3BlcnR5KTsKLQkJCWFzc2VydEVxdWFscyhjRXZlbnQuZ2V0UHJvcGVydHkoKSwgcHJvcGVydHkpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGEsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBBLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGIsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBCLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJYXNzZXJ0RXF1YWxzKGMsIGRhdGFNb2RlbCk7Ci0JCQkJCWFzc2VydEVxdWFscyhmbGFnLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQkJCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBDLlApOwotCQkJCQlhc3NlcnRUcnVlKCFkYXRhTW9kZWwuaXNQcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvTmVzdGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0aW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk4OWM1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9OZXN0aW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFJlc291cmNlSGFuZGxlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICovCi1wdWJsaWMgY2xhc3MgTmVzdGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElEYXRhTW9kZWwgYTsKLQlwcml2YXRlIElEYXRhTW9kZWwgYjsKLQlwcml2YXRlIElEYXRhTW9kZWwgYzsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWEgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQSgpKTsKLQkJYiA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBCKCkpOwotCQljID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG51bGwgIT0gYSkgewotCQkJYS5kaXNwb3NlKCk7Ci0JCQlhID0gbnVsbDsKLQkJfQotCQlpZiAobnVsbCAhPSBiKSB7Ci0JCQliLmRpc3Bvc2UoKTsKLQkJCWIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKG51bGwgIT0gYykgewotCQkJYy5kaXNwb3NlKCk7Ci0JCQljID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmVzdGVkTW9kZWwoKSB7Ci0JCVN0cmluZyBORVNURURfTU9ERUxfTk9UX0xPQ0FURUQgPSBXVFBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMSIpOyAvLyROT04tTkxTLTEkCi0JCUV4Y2VwdGlvbiBleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhLmdldE5lc3RlZE1vZGVsKCJmb28iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChORVNURURfTU9ERUxfTk9UX0xPQ0FURUQpKTsKLQkJZXggPSBudWxsOwotCQl0cnkgewotCQkJYS5nZXROZXN0ZWRNb2RlbChudWxsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChORVNURURfTU9ERUxfTk9UX0xPQ0FURUQpKTsKLQotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7Ci0JCWV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWEuZ2V0TmVzdGVkTW9kZWwobnVsbCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoTkVTVEVEX01PREVMX05PVF9MT0NBVEVEKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOZXN0ZWRNb2RlbCgpIHsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRNb2RlbCgiIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc05lc3RlZE1vZGVsKG51bGwpKTsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzTmVzdGVkTW9kZWwoImIiKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkTW9kZWwoImMiKSk7Ci0JCWEuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZE1vZGVsKCJjIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb25FeGlzdGVudE1vZGVscygpIHsKLQkJQXNzZXJ0LmFzc2VydE51bGwoYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYSIpKTsKLQkJQXNzZXJ0LmFzc2VydE51bGwoYS5yZW1vdmVOZXN0ZWRNb2RlbChudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5lc3RlZEFuZEdldE5lc3RpbmcoKSB7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYS5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGIuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuZ2V0TmVzdGVkTW9kZWxzKCkuY29udGFpbnMoYikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGIsIGEuZ2V0TmVzdGVkTW9kZWwoImIiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYi5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5nZXROZXN0aW5nTW9kZWxzKCkuY29udGFpbnMoYSkpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKGEuYWRkTmVzdGVkTW9kZWwoImMiLCBjKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmdldE5lc3RlZE1vZGVscygpLmNvbnRhaW5zKGMpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscyhjLCBhLmdldE5lc3RlZE1vZGVsKCJjIikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuZ2V0TmVzdGluZ01vZGVscygpLmNvbnRhaW5zKGEpKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmFkZE5lc3RlZE1vZGVsKCJjIiwgYykpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGIuZ2V0TmVzdGVkTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5nZXROZXN0ZWRNb2RlbHMoKS5jb250YWlucyhjKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYy5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5nZXROZXN0aW5nTW9kZWxzKCkuY29udGFpbnMoYikpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYiwgYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYiIpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYi5nZXROZXN0aW5nTW9kZWxzKCkuc2l6ZSgpKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGMsIGEucmVtb3ZlTmVzdGVkTW9kZWwoImMiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYS5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuZ2V0TmVzdGluZ01vZGVscygpLmNvbnRhaW5zKGIpKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGMsIGIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgYi5nZXROZXN0ZWRNb2RlbHMoKS5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGMuZ2V0TmVzdGluZ01vZGVscygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlbGZOZXN0KCkgewotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5hZGROZXN0ZWRNb2RlbCgiYSIsIGEpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygwLCBhLmdldE5lc3RlZE1vZGVscygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZU5lc3QoKSB7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuYWRkTmVzdGVkTW9kZWwoImIxIiwgYikpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKGIsIGEuZ2V0TmVzdGVkTW9kZWwoImIxIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5hZGROZXN0ZWRNb2RlbCgiYjIiLCBiKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoYiwgYS5nZXROZXN0ZWRNb2RlbCgiYjEiKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkTW9kZWwoImIyIikpOwotCX0KLQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgMyAgICA0ICAgICA1ICAgIDYKLQkgKiBBICB8IEEgfCBBICB8IEEgICB8IEEgIHwgQQotCSAqICBCIHwgICB8ICBCIHwgIEIgIHwgIEIgfCAgQgotCSAqICAgICAgICAgICAgICAgICBDIHwgICAgfCAgIEMKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlTaW1wbGVOZXN0aW5nMCgpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIik7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkUHJvcGVydHkoQi5QKSk7Ci0KLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAzCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCi0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gNQotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRQcm9wZXJ0eShDLlApKTsKLQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDYKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPgotCSAqIDEgICAgMiAgICAgMyAgICA0Ci0JICogQSAgfCBBICAgfCBBICB8IEEKLQkgKiAgQiB8ICBCICB8ICBCIHwKLQkgKiAgICAgICAgQyB8ICAgIHwKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlTaW1wbGVOZXN0aW5nMSgpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzQmFzZVByb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNOZXN0ZWRQcm9wZXJ0eShCLlApKTsKLQkJLy8gY2hlY2sgYSdzIG5lc3RlZAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiID09IGEuZ2V0TmVzdGVkTW9kZWwoImIiKSk7Ci0JCUNvbGxlY3Rpb24gbmVzdGVkTW9kZWxOYW1lcyA9IGEuZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZE1vZGVsTmFtZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkTW9kZWxOYW1lcy5jb250YWlucygiYiIpKTsKLQkJQ29sbGVjdGlvbiBiYXNlUHJvcGVydGllcyA9IGEuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJQ29sbGVjdGlvbiBuZXN0ZWRQcm9wZXJ0aWVzID0gYS5nZXROZXN0ZWRQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgbmVzdGVkUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQlDb2xsZWN0aW9uIGFsbFByb3BlcnRpZXMgPSBhLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscyg0LCBhbGxQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQi5QKSk7Ci0KLQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc05lc3RlZFByb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzTmVzdGVkUHJvcGVydHkoQy5QKSk7Ci0JCS8vIGNoZWNrIGEncyBuZXN0ZWQKLQkJQXNzZXJ0LmFzc2VydFRydWUoYiA9PSBhLmdldE5lc3RlZE1vZGVsKCJiIikpOwotCQluZXN0ZWRNb2RlbE5hbWVzID0gYS5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRNb2RlbE5hbWVzLmNvbnRhaW5zKCJiIikpOwotCQliYXNlUHJvcGVydGllcyA9IGEuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJbmVzdGVkUHJvcGVydGllcyA9IGEuZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsIG5lc3RlZFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkUHJvcGVydGllcy5jb250YWlucyhDLlApKTsKLQkJYWxsUHJvcGVydGllcyA9IGEuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDUsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhDLlApKTsKLQkJLy8gY2hlY2sgYidzIG5lc3RlZAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjID09IGIuZ2V0TmVzdGVkTW9kZWwoImMiKSk7Ci0JCW5lc3RlZE1vZGVsTmFtZXMgPSBiLmdldE5lc3RlZE1vZGVsTmFtZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygxLCBuZXN0ZWRNb2RlbE5hbWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKG5lc3RlZE1vZGVsTmFtZXMuY29udGFpbnMoImMiKSk7Ci0JCWJhc2VQcm9wZXJ0aWVzID0gYi5nZXRCYXNlUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGJhc2VQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGJhc2VQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQluZXN0ZWRQcm9wZXJ0aWVzID0gYi5nZXROZXN0ZWRQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgbmVzdGVkUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKEMuUCkpOwotCQlhbGxQcm9wZXJ0aWVzID0gYi5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoNCwgYWxsUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxQcm9wZXJ0aWVzLmNvbnRhaW5zKEMuUCkpOwotCi0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gMwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc0Jhc2VQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNOZXN0ZWRQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNCYXNlUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzTmVzdGVkUHJvcGVydHkoQy5QKSk7Ci0JCS8vIGNoZWNrIGEncyBuZXN0ZWQKLQkJQXNzZXJ0LmFzc2VydFRydWUoYiA9PSBhLmdldE5lc3RlZE1vZGVsKCJiIikpOwotCQluZXN0ZWRNb2RlbE5hbWVzID0gYS5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShuZXN0ZWRNb2RlbE5hbWVzLmNvbnRhaW5zKCJiIikpOwotCQliYXNlUHJvcGVydGllcyA9IGEuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJbmVzdGVkUHJvcGVydGllcyA9IGEuZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIG5lc3RlZFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUobmVzdGVkUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJYWxsUHJvcGVydGllcyA9IGEuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDQsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJLy8gY2hlY2sgYidzIG5lc3RlZAotCQluZXN0ZWRNb2RlbE5hbWVzID0gYi5nZXROZXN0ZWRNb2RlbE5hbWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbmVzdGVkTW9kZWxOYW1lcy5zaXplKCkpOwotCQliYXNlUHJvcGVydGllcyA9IGIuZ2V0QmFzZVByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBiYXNlUHJvcGVydGllcy5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiYXNlUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQkJbmVzdGVkUHJvcGVydGllcyA9IGIuZ2V0TmVzdGVkUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5lc3RlZFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJYWxsUHJvcGVydGllcyA9IGIuZ2V0QWxsUHJvcGVydGllcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGFsbFByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYWxsUHJvcGVydGllcy5jb250YWlucyhCLlApKTsKLQotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIik7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNCYXNlUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzTmVzdGVkUHJvcGVydHkoQi5QKSk7Ci0JCS8vIGNoZWNrIGEncyBuZXN0ZWQKLQkJbmVzdGVkTW9kZWxOYW1lcyA9IGEuZ2V0TmVzdGVkTW9kZWxOYW1lcygpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG5lc3RlZE1vZGVsTmFtZXMuc2l6ZSgpKTsKLQkJYmFzZVByb3BlcnRpZXMgPSBhLmdldEJhc2VQcm9wZXJ0aWVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoMywgYmFzZVByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYmFzZVByb3BlcnRpZXMuY29udGFpbnMoQS5QKSk7Ci0JCW5lc3RlZFByb3BlcnRpZXMgPSBhLmdldE5lc3RlZFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygyLCBuZXN0ZWRQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCWFsbFByb3BlcnRpZXMgPSBhLmdldEFsbFByb3BlcnRpZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygzLCBhbGxQcm9wZXJ0aWVzLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGFsbFByb3BlcnRpZXMuY29udGFpbnMoQS5QKSk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgICAzICAgIDQgCi0JICogQSAgfCBBICAgfCBBICB8IEEKLQkgKiAgICB8ICBCICB8ICAgIHwgCi0JICogQiAgfCAgIEMgfCBCICB8IEIKLQkgKiAgQyB8ICAgICB8ICBDIHwgCi0JICogICAgICAgICAgfCAgICB8IEMKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlTaW1wbGVOZXN0aW5nMigpIHsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQotCQlhLmFkZE5lc3RlZE1vZGVsKCJiIiwgYik7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0KLQkJYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYiIpOyAvLyAzCi0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0KLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyA0Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Ci0JICogMSAgICAyICAgICAzICAgICAgNCAgICAgNQotCSAqIEEgIHwgQSAgIHwgQSAgICB8IEEgICB8IEEKLQkgKiAgQiB8ICBCICB8ICBCICAgfCAgQiAgfCAgQgotCSAqICAgICAgICBDIHwgICBDICB8ICAgQyB8Ci0JICogICAgICAgICAgfCAgIEMyIHwKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlDb21wbGV4TmVzdGluZzEoKSB7Ci0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsgLy8gMQotCQliLmFkZE5lc3RlZE1vZGVsKCJjIiwgYyk7IC8vIDIKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlJRGF0YU1vZGVsIGMyID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEMoKSk7Ci0JCWIuYWRkTmVzdGVkTW9kZWwoImMyIiwgYzIpOyAvLyAzCi0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMyIik7IC8vIDQKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gNQotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPgotCSAqIDEgICAgMiAgICAgMyAgICAgNCAgICAgNSAgICAgIDYgICAgICA3Ci0JICogQSAgfCBBICAgfCBBICAgfCBBICAgfCBBICAgIHwgQSAgICB8IEEKLQkgKiAgQiB8ICBCICB8ICBCICB8ICBCICB8ICBCICAgfCAgQiAgIHwgIEIKLQkgKiAgICAgICAgQyB8ICAgQyB8ICAgQyB8ICAgQyAgfCAgIEMyIHwKLQkgKiAgICAgICAgICAgICBDMiB8ICAgICAgICAgQzIgfAotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQcm9wZXJ0eUNvbXBsZXhOZXN0aW5nMigpIHsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyAxCi0JCWIuYWRkTmVzdGVkTW9kZWwoImMiLCBjKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUlEYXRhTW9kZWwgYzIgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQygpKTsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYzIiLCBjMik7IC8vIDMKLQkJYS5yZW1vdmVOZXN0ZWRNb2RlbCgiYzIiKTsgLy8gNAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCWIuYWRkTmVzdGVkTW9kZWwoImMyIiwgYzIpOyAvLyA1Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYyIpOyAvLyA2Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJYi5yZW1vdmVOZXN0ZWRNb2RlbCgiYzIiKTsgLy8gNwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KEMuUCkpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPgotCSAqIDEgICAgIDIgICAgICAgICAgICAgMyAgICAgIDQgICAgICAgICAgICAgNSAgICAgNgotCSAqIEEgICB8IEEgICAgICAgICAgIHwgQiAgICB8IEEgICAgICAgICAgfCAgQyAgIHwgQQotCSAqICBCICB8ICBCICAgICAgICAgIHwgIEMgICB8ICBCICAgICAgICAgfCAgIEEgIHwgQgotCSAqICAgQyB8ICAgQyAgICAgICAgIHwgICBBICB8ICAgQyAgICAgICAgfCAgICBCIHwgQwotCSAqICAgICAgICAgIEEgKGxvb3ApIHwgICAgICB8ICAgIEEobG9vcCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdElzUHJvcGVydHlDb21wbGV4TmVzdGluZzMoKSB7Ci0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOyAvLyAxCi0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCWMuYWRkTmVzdGVkTW9kZWwoImEiLCBhKTsgLy8gMgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlhLnJlbW92ZU5lc3RlZE1vZGVsKCJiIik7IC8vIDMKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYi5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJYS5hZGROZXN0ZWRNb2RlbCgiYiIsIGIpOyAvLyA0Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYS5pc1Byb3BlcnR5KEMuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShiLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEEuUCkpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShjLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYy5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCWIucmVtb3ZlTmVzdGVkTW9kZWwoImMiKTsgLy8gNQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShhLmlzUHJvcGVydHkoQi5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShhLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQS5QKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoQy5QKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoYy5pc1Byb3BlcnR5KEIuUCkpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYS5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShiLmlzUHJvcGVydHkoImZvbyIpKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQljLnJlbW92ZU5lc3RlZE1vZGVsKCJhIik7Ci0JCWEucmVtb3ZlTmVzdGVkTW9kZWwoImIiKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGIuaXNQcm9wZXJ0eShDLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShBLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGMuaXNQcm9wZXJ0eShCLlApKTsKLQkJQXNzZXJ0LmFzc2VydEZhbHNlKGEuaXNQcm9wZXJ0eSgiZm9vIikpOwotCQlBc3NlcnQuYXNzZXJ0RmFsc2UoYi5pc1Byb3BlcnR5KCJmb28iKSk7Ci0JCUFzc2VydC5hc3NlcnRGYWxzZShjLmlzUHJvcGVydHkoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0UHJvcGVydHkxKCkgewotCQkvLyBjeWxpY2FsCi0JCWEuYWRkTmVzdGVkTW9kZWwoImIiLCBiKTsKLQkJYi5hZGROZXN0ZWRNb2RlbCgiYyIsIGMpOwotCQljLmFkZE5lc3RlZE1vZGVsKCJhIiwgYSk7Ci0KLQkJYS5zZXRQcm9wZXJ0eShBLlAsICJhIik7Ci0JCWEuc2V0UHJvcGVydHkoQi5QLCAiYiIpOwotCQlhLnNldFByb3BlcnR5KEMuUCwgImMiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgYS5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgYi5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgYy5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiIiwgYS5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiIiwgYi5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiIiwgYy5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYS5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYi5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjIiwgYy5nZXRQcm9wZXJ0eShDLlApKTsKLQotCQliLnNldFByb3BlcnR5KEEuUCwgImFhIik7Ci0JCWIuc2V0UHJvcGVydHkoQi5QLCAiYmIiKTsKLQkJYi5zZXRQcm9wZXJ0eShDLlAsICJjYyIpOwotCQlhc3NlcnRFcXVhbHMoImFhIiwgYS5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYSIsIGIuZ2V0UHJvcGVydHkoQS5QKSk7Ci0JCWFzc2VydEVxdWFscygiYWEiLCBjLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImJiIiwgYS5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYiIsIGIuZ2V0UHJvcGVydHkoQi5QKSk7Ci0JCWFzc2VydEVxdWFscygiYmIiLCBjLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImNjIiwgYS5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYyIsIGIuZ2V0UHJvcGVydHkoQy5QKSk7Ci0JCWFzc2VydEVxdWFscygiY2MiLCBjLmdldFByb3BlcnR5KEMuUCkpOwotCi0JCWMuc2V0UHJvcGVydHkoQS5QLCAiYWFhIik7Ci0JCWMuc2V0UHJvcGVydHkoQi5QLCAiYmJiIik7Ci0JCWMuc2V0UHJvcGVydHkoQy5QLCAiY2NjIik7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgYS5nZXRQcm9wZXJ0eShBLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBiLmdldFByb3BlcnR5KEEuUCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIGMuZ2V0UHJvcGVydHkoQS5QKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgYS5nZXRQcm9wZXJ0eShCLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBiLmdldFByb3BlcnR5KEIuUCkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIGMuZ2V0UHJvcGVydHkoQi5QKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgYS5nZXRQcm9wZXJ0eShDLlApKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCBiLmdldFByb3BlcnR5KEMuUCkpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIGMuZ2V0UHJvcGVydHkoQy5QKSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvU2ltcGxlRGF0YU1vZGVsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1NpbXBsZURhdGFNb2RlbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4MjA3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvU2ltcGxlRGF0YU1vZGVsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBSZXNvdXJjZUhhbmRsZXI7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZURhdGFNb2RlbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIGNsYXNzIERNUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX1BST1AgPSAiSU5UX1BST1AiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfUFJPUDIgPSAiSU5UX1BST1AyIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX1BST1AzID0gIklOVF9QUk9QMyI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9QUk9QNCA9ICJJTlRfUFJPUDQiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX1BST1AgPSAiQk9PTEVBTl9QUk9QIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTl9QUk9QMiA9ICJCT09MRUFOX1BST1AyIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1BST1AgPSAiU1RSSU5HX1BST1AiOwotCi0JCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoSU5UX1BST1ApOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoSU5UX1BST1AyKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKElOVF9QUk9QMyk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChJTlRfUFJPUDQpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoQk9PTEVBTl9QUk9QKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEJPT0xFQU5fUFJPUDIpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoU1RSSU5HX1BST1ApOwotCQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTlRfUFJPUCkpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMTApOwotCQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVF9QUk9QMikpIHsKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydHkoSU5UX1BST1ApOwotCQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEJPT0xFQU5fUFJPUCkpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNUUklOR19QUk9QKSkgewotCQkJCXJldHVybiAiZm9vIiArIGdldFByb3BlcnR5KElOVF9QUk9QKSArIGdldFByb3BlcnR5KEJPT0xFQU5fUFJPUCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhCT09MRUFOX1BST1AyKSkgewotCQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoQk9PTEVBTl9QUk9QKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVF9QUk9QKSkgewotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKElOVF9QUk9QMiwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKElOVF9QUk9QMiwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShTVFJJTkdfUFJPUCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl9Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhCT09MRUFOX1BST1ApKSB7Ci0JCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQk9PTEVBTl9QUk9QMiwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShTVFJJTkdfUFJPUCwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJaWYgKElOVF9QUk9QMi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCWludCByYW5nZSA9IGdldEludFByb3BlcnR5KElOVF9QUk9QKTsKLQkJCQlJbnRlZ2VyW10gaW50cyA9IG5ldyBJbnRlZ2VyW3JhbmdlXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGludHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkgKyAxKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci5jcmVhdGVEZXNjcmlwdG9ycyhpbnRzKTsKLQkJCX0KLQkJCWlmIChJTlRfUFJPUDMuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQlpbnQgcmFuZ2UgPSAzOwotCQkJCUludGVnZXJbXSBpbnRzID0gbmV3IEludGVnZXJbcmFuZ2VdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpbnRzW2ldID0gbmV3IEludGVnZXIoaSArIDEpOwotCQkJCX0KLQkJCQlTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBuZXcgU3RyaW5nW117Im9uZSIsICJ0d28iLCAidGhyZWUifTsKLQkJCQlyZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKGludHMsIGRlc2NyaXB0aW9ucyk7Ci0JCQl9Ci0JCQlpZiAoSU5UX1BST1A0LmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzNdOwotCQkJCVN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IG5ldyBTdHJpbmdbXXsib25lIiwgInR3byIsICJ0aHJlZSJ9OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKGkgKyAxKSwgZGVzY3JpcHRpb25zW2ldKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlPYmplY3QgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKElOVF9QUk9QMi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5KTsKLQkJCX0gZWxzZSBpZiAoSU5UX1BST1AzLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IElOVF9QUk9QNC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCVN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IG5ldyBTdHJpbmdbXXsib25lIiwgInR3byIsICJ0aHJlZSJ9OwotCQkJCWludCB2YWx1ZSA9ICgoSW50ZWdlcikgcHJvcGVydHkpLmludFZhbHVlKCk7Ci0JCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHksIGRlc2NyaXB0aW9uc1t2YWx1ZSAtIDFdKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQkJcmV0dXJuIGlkOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0RXh0ZW5kZWRDb250ZXh0KCkgewotCQkJcmV0dXJuIGV4dGVuZGVkQ29udGV4dDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBMaXN0IGV4dGVuZGVkQ29udGV4dDsKLQotCXByaXZhdGUgSURhdGFNb2RlbCBkbTsKLQlwcml2YXRlIFRlc3RMaXN0ZW5lciBkbUw7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBETVByb3ZpZGVyKCkpOwotCQlkbUwgPSBuZXcgVGVzdExpc3RlbmVyKCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljcygpIHsKLQkJaWQgPSBudWxsOwotCQlhc3NlcnRFcXVhbHMoIiIsIGRtLmdldElEKCkpOwotCQlpZCA9ICJmb28iOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGRtLmdldElEKCkpOwotCQlleHRlbmRlZENvbnRleHQgPSBudWxsOwotCQlhc3NlcnROb3ROdWxsKGRtLmdldEV4dGVuZGVkQ29udGV4dCgpKTsKLQkJZXh0ZW5kZWRDb250ZXh0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlhc3NlcnRUcnVlKGRtLmdldEV4dGVuZGVkQ29udGV4dCgpID09IGV4dGVuZGVkQ29udGV4dCk7Ci0JCWV4dGVuZGVkQ29udGV4dC5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKGRtLmdldEV4dGVuZGVkQ29udGV4dCgpID09IGV4dGVuZGVkQ29udGV4dCk7Ci0JCWFzc2VydE5vdE51bGwoZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByb3BlcnR5KCkgewotCQlTdHJpbmcgUFJPUEVSVFlfTk9UX0xPQ0FURURfID0gV1RQUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMjAiKTsgLy8kTk9OLU5MUy0xJAotCQlFeGNlcHRpb24gZXggPSBudWxsOwotCQl0cnkgewotCQkJZG0uZ2V0UHJvcGVydHkoImZvbyIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKFBST1BFUlRZX05PVF9MT0NBVEVEXykpOwotCQlleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkbS5nZXRJbnRQcm9wZXJ0eSgiZm9vIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoUFJPUEVSVFlfTk9UX0xPQ0FURURfKSk7Ci0JCWV4ID0gbnVsbDsKLQkJZXggPSBudWxsOwotCQl0cnkgewotCQkJZG0uZ2V0Qm9vbGVhblByb3BlcnR5KCJmb28iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleCA9IGU7Ci0JCX0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZXgpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChQUk9QRVJUWV9OT1RfTE9DQVRFRF8pKTsKLQkJZXggPSBudWxsOwotCQlleCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkbS5nZXRTdHJpbmdQcm9wZXJ0eSgiZm9vIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXggPSBlOwotCQl9Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKGV4KTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoUFJPUEVSVFlfTk9UX0xPQ0FURURfKSk7Ci0JCWV4ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRtLmdldFN0cmluZ1Byb3BlcnR5KG51bGwpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWV4ID0gZTsKLQkJfQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChleCk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKFBST1BFUlRZX05PVF9MT0NBVEVEXykpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZG0uZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKERNUHJvdmlkZXIuSU5UX1BST1AyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaW50IHZhbHVlID0gaSArIDE7Ci0JCQlhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcikgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscygiIiArIHZhbHVlLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWRlc2NyaXB0b3JzID0gZG0uZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKERNUHJvdmlkZXIuSU5UX1BST1AzKTsKLQkJU3RyaW5nW10gZGVzY3JpcHRpb25zID0gbmV3IFN0cmluZ1tdeyJvbmUiLCAidHdvIiwgInRocmVlIn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWludCB2YWx1ZSA9IGkgKyAxOwotCQkJYXNzZXJ0RXF1YWxzKHZhbHVlLCAoKEludGVnZXIpIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKSkuaW50VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZGVzY3JpcHRpb25zW2ldLCBkZXNjcmlwdG9yc1tpXS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWRlc2NyaXB0b3JzID0gZG0uZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKERNUHJvdmlkZXIuSU5UX1BST1A0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJaW50IHZhbHVlID0gaSArIDE7Ci0JCQlhc3NlcnRFcXVhbHModmFsdWUsICgoSW50ZWdlcikgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdGlvbnNbaV0sIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKLQkJCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyLCBpKTsKLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZG0uZ2V0UHJvcGVydHlEZXNjcmlwdG9yKERNUHJvdmlkZXIuSU5UX1BST1AyKTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUoKSwgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIpKTsKLQkJCWFzc2VydEVxdWFscygoKEludGVnZXIpIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpLCBkbS5nZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMikpOwotCQkJYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5lcXVhbHMoSW50ZWdlci50b1N0cmluZyhpKSkpOwotCi0JCQlkbS5zZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMywgaSk7Ci0JCQlkZXNjcmlwdG9yID0gZG0uZ2V0UHJvcGVydHlEZXNjcmlwdG9yKERNUHJvdmlkZXIuSU5UX1BST1AzKTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUoKSwgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDMpKTsKLQkJCWFzc2VydEVxdWFscygoKEludGVnZXIpIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpLCBkbS5nZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QMykpOwotCQkJYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5lcXVhbHMoZGVzY3JpcHRpb25zW2kgLSAxXSkpOwotCi0JCQlkbS5zZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QNCwgaSk7Ci0JCQlkZXNjcmlwdG9yID0gZG0uZ2V0UHJvcGVydHlEZXNjcmlwdG9yKERNUHJvdmlkZXIuSU5UX1BST1A0KTsKLQkJCWFzc2VydEVxdWFscyhkZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUoKSwgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDQpKTsKLQkJCWFzc2VydEVxdWFscygoKEludGVnZXIpIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSgpKS5pbnRWYWx1ZSgpLCBkbS5nZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QNCkpOwotCQkJYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5lcXVhbHMoZGVzY3JpcHRpb25zW2kgLSAxXSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkbS5nZXRCb29sZWFuUHJvcGVydHkoRE1Qcm92aWRlci5CT09MRUFOX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoQm9vbGVhbikgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5CT09MRUFOX1BST1ApKS5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgZG0uZ2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsICgoSW50ZWdlcikgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUCkpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzEwdHJ1ZSIsIChTdHJpbmcpIGRtLmdldFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMHRydWUiLCBkbS5nZXRTdHJpbmdQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlZE9uTGlzdGVuZXIoKSB7Ci0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlEYXRhTW9kZWxFdmVudCBldmVudCA9IG5ldyBEYXRhTW9kZWxFdmVudChkbSwgQS5QLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQlkbUwucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJTGlzdCBldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShldmVudHMuY29udGFpbnMoZXZlbnQpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJSURhdGFNb2RlbExpc3RlbmVyIGlkbWwgPSBkbUw7Ci0JCWlkbWwucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoZXZlbnRzLmNvbnRhaW5zKGV2ZW50KSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGlzdGVuZXIoKSB7Ci0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlkbS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShETVByb3ZpZGVyLklOVF9QUk9QMiwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCUxpc3QgZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnJlbW92ZUxpc3RlbmVyKGRtTCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMCwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLmFkZExpc3RlbmVyKGRtTCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnJlbW92ZUxpc3RlbmVyKGRtTCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMCwgZXZlbnRzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmluZ0V2ZW50cygpIHsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLm5vdGlmeVByb3BlcnR5Q2hhbmdlKERNUHJvdmlkZXIuSU5UX1BST1AyLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJTGlzdCBldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBldmVudHMuc2l6ZSgpKTsKLQkJRGF0YU1vZGVsRXZlbnQgZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLklOVF9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCi0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlkbS5ub3RpZnlQcm9wZXJ0eUNoYW5nZShETVByb3ZpZGVyLklOVF9QUk9QMiwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCWV2ZW50ID0gKERhdGFNb2RlbEV2ZW50KSBldmVudHMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoRE1Qcm92aWRlci5JTlRfUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTElEX1ZBTFVFU19DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVNldEV2ZW50cygpIHsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyLCAxMDApOwotCQlMaXN0IGV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGV2ZW50cy5zaXplKCkpOwotCQlEYXRhTW9kZWxFdmVudCBldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGRtLmdldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEludFByb3BlcnR5KERNUHJvdmlkZXIuSU5UX1BST1AyLCAxMDApOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygwLCBldmVudHMuc2l6ZSgpKTsKLQotCQlkbUwuY2xlYXJFdmVudHMoKTsKLQkJZG0uc2V0SW50UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIsIDEwMSk7Ci0JCWV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGV2ZW50cy5zaXplKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXhFdmVudHMoKSB7Ci0JCWRtTC5jbGVhckV2ZW50cygpOwotCQlkbS5zZXRJbnRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QLCAxMSk7Ci0JCUxpc3QgZXZlbnRzID0gZG1MLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoNCwgZXZlbnRzLnNpemUoKSk7Ci0KLQkJRGF0YU1vZGVsRXZlbnQgZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLklOVF9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlhc3NlcnRFcXVhbHMoMTEsICgoSW50ZWdlcikgZG0uZ2V0UHJvcGVydHkoRE1Qcm92aWRlci5JTlRfUFJPUDIpKS5pbnRWYWx1ZSgpKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuSU5UX1BST1AyLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxJRF9WQUxVRVNfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGV2ZW50LmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9yczIgPSBkbS5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRE1Qcm92aWRlci5JTlRfUFJPUDIpOwotCQlhc3NlcnRFcXVhbHMoMTEsIGRlc2NyaXB0b3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygxMSwgZGVzY3JpcHRvcnMyLmxlbmd0aCk7Ci0KLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMik7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLlNUUklOR19QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTF0cnVlIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTF0cnVlIiwgZG0uZ2V0RGVmYXVsdFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMXRydWUiLCBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0KLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMyk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLklOVF9QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgKChJbnRlZ2VyKSBkbS5nZXRQcm9wZXJ0eShETVByb3ZpZGVyLklOVF9QUk9QKSkuaW50VmFsdWUoKSk7Ci0KLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgZmFsc2UpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygzLCBldmVudHMuc2l6ZSgpKTsKLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLkJPT0xFQU5fUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEZhbHNlKGRtLmlzUHJvcGVydHlFbmFibGVkKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMikpOwotCQlhc3NlcnRGYWxzZShldmVudC5pc1Byb3BlcnR5RW5hYmxlZCgpKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuU1RSSU5HX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTFmYWxzZSIsIGRtLmdldERlZmF1bHRQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMTFmYWxzZSIsIGRtLmdldFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgyKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZG0uZ2V0Qm9vbGVhblByb3BlcnR5KERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QKSk7Ci0KLQkJZG0uc2V0U3RyaW5nUHJvcGVydHkoRE1Qcm92aWRlci5TVFJJTkdfUFJPUCwgImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGRtLmdldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZG0uZ2V0RGVmYXVsdFByb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgdHJ1ZSk7Ci0JCWV2ZW50cyA9IGRtTC5nZXRFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGV2ZW50cy5zaXplKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMiwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBkbS5nZXRTdHJpbmdQcm9wZXJ0eShETVByb3ZpZGVyLlNUUklOR19QUk9QKSk7Ci0JCWRtLnNldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1AsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImZvbzExdHJ1ZSIsIGRtLmdldFN0cmluZ1Byb3BlcnR5KERNUHJvdmlkZXIuU1RSSU5HX1BST1ApKTsKLQkJZG1MLmNsZWFyRXZlbnRzKCk7Ci0JCWRtLnNldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgZmFsc2UpOwotCQlldmVudHMgPSBkbUwuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygzLCBldmVudHMuc2l6ZSgpKTsKLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLkJPT0xFQU5fUFJPUDIsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LkVOQUJMRV9DSEcsIGV2ZW50LmdldEZsYWcoKSk7Ci0JCWFzc2VydEZhbHNlKGRtLmlzUHJvcGVydHlFbmFibGVkKERNUHJvdmlkZXIuQk9PTEVBTl9QUk9QMikpOwotCQlhc3NlcnRGYWxzZShldmVudC5pc1Byb3BlcnR5RW5hYmxlZCgpKTsKLQotCQlldmVudCA9IChEYXRhTW9kZWxFdmVudCkgZXZlbnRzLmdldCgxKTsKLQkJYXNzZXJ0RXF1YWxzKERNUHJvdmlkZXIuU1RSSU5HX1BST1AsIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRywgZXZlbnQuZ2V0RmxhZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xMWZhbHNlIiwgZXZlbnQuZ2V0UHJvcGVydHkoKSk7Ci0KLQkJZXZlbnQgPSAoRGF0YU1vZGVsRXZlbnQpIGV2ZW50cy5nZXQoMik7Ci0JCWFzc2VydEVxdWFscyhETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHLCBldmVudC5nZXRGbGFnKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRtLmdldEJvb2xlYW5Qcm9wZXJ0eShETVByb3ZpZGVyLkJPT0xFQU5fUFJPUCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RBYnN0cmFjdERNUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9UZXN0QWJzdHJhY3RETVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTU0NDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RBYnN0cmFjdERNUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RBYnN0cmFjdERNUHJvdmlkZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URUdFUiA9ICJJTlRFR0VSIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PTEVBTiA9ICJCT09MRUFOIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HID0gIlNUUklORyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVCA9ICJPQkpFQ1QiOwotCi0JcHJpdmF0ZSBjbGFzcyBETU9wIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotCi0JCXB1YmxpYyBETU9wKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBETU9wKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJCXN1cGVyKG1vZGVsKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBpZCkgewotCQkJc3VwZXIuc2V0SUQoaWQpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJCXJldHVybiBzdXBlci5nZXRJRCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJCXN1cGVyLnNldERhdGFNb2RlbChtb2RlbCk7Ci0JCX0KLQotCQlwdWJsaWMgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RGF0YU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIERNUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKXsKLQkJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoSU5URUdFUik7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChCT09MRUFOKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKFNUUklORyk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChPQkpFQ1QpOwotCQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQkJc3VwZXIuaW5pdCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJCXJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQl9Ci0KLQkJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRFeHRlbmRlZENvbnRleHQoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0RXh0ZW5kZWRDb250ZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SUQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm90ZWN0ZWRUZXN0KCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHkoSU5URUdFUik7Ci0JCQlzdXBlci5zZXRQcm9wZXJ0eShJTlRFR0VSLCBuZXcgSW50ZWdlcigxKSk7Ci0JCQlzdXBlci5nZXRCb29sZWFuUHJvcGVydHkoQk9PTEVBTik7Ci0JCQlzdXBlci5zZXRCb29sZWFuUHJvcGVydHkoQk9PTEVBTiwgdHJ1ZSk7Ci0JCQlzdXBlci5nZXRJbnRQcm9wZXJ0eShJTlRFR0VSKTsKLQkJCXN1cGVyLnNldEludFByb3BlcnR5KElOVEVHRVIsIDEpOwotCQkJc3VwZXIuZ2V0U3RyaW5nUHJvcGVydHkoU1RSSU5HKTsKLQkJCXN1cGVyLmlzUHJvcGVydHlTZXQoSU5URUdFUik7Ci0JCX0KLQl9Ci0KLQlJRGF0YU1vZGVsUHJvdmlkZXIgaWRtcCA9IG51bGw7Ci0JQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBkbXAgPSBudWxsOwotCUlEYXRhTW9kZWwgZG0gPSBudWxsOwotCi0JSURhdGFNb2RlbE9wZXJhdGlvbiBpZG1vID0gbnVsbDsKLQlBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiBkbW8gPSBudWxsOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZG1wID0gbmV3IERNUHJvdmlkZXIoKTsKLQkJaWRtcCA9IGRtcDsKLQkJZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChkbXApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlkbXAuc2V0RGF0YU1vZGVsKGRtKTsKLQkJYXNzZXJ0VHJ1ZShkbSA9PSBkbXAuZ2V0RGF0YU1vZGVsKCkpOwotCQlhc3NlcnROb3ROdWxsKGRtcC5nZXRQcm9wZXJ0eU5hbWVzKCkpOwotCQlkbXAuaW5pdCgpOwotCQlhc3NlcnROdWxsKGRtcC5nZXREZWZhdWx0UHJvcGVydHkoSU5URUdFUikpOwotCQlhc3NlcnRUcnVlKGRtcC5pc1Byb3BlcnR5RW5hYmxlZChJTlRFR0VSKSk7Ci0JCWFzc2VydE51bGwoZG1wLnZhbGlkYXRlKElOVEVHRVIpKTsKLQkJYXNzZXJ0VHJ1ZShkbXAucHJvcGVydHlTZXQoSU5URUdFUiwgbmV3IEludGVnZXIoMSkpKTsKLQkJYXNzZXJ0TnVsbChkbXAuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChkbXAuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChkbXAuZ2V0RXh0ZW5kZWRDb250ZXh0KCkpOwotCQlhc3NlcnROdWxsKGRtcC5nZXREZWZhdWx0T3BlcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGRtcC5nZXRJRCgpLmVxdWFscyhkbXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJKChETVByb3ZpZGVyKSBkbXApLnByb3RlY3RlZFRlc3QoKTsKLQkJZG1wLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SURhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlpZG1wLnNldERhdGFNb2RlbChkbSk7Ci0JCWFzc2VydFRydWUoZG0gPT0gaWRtcC5nZXREYXRhTW9kZWwoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRtcC5nZXRQcm9wZXJ0eU5hbWVzKCkpOwotCQlpZG1wLmluaXQoKTsKLQkJYXNzZXJ0TnVsbChpZG1wLmdldERlZmF1bHRQcm9wZXJ0eShJTlRFR0VSKSk7Ci0JCWFzc2VydFRydWUoaWRtcC5pc1Byb3BlcnR5RW5hYmxlZChJTlRFR0VSKSk7Ci0JCWFzc2VydE51bGwoaWRtcC52YWxpZGF0ZShJTlRFR0VSKSk7Ci0JCWFzc2VydFRydWUoaWRtcC5wcm9wZXJ0eVNldChJTlRFR0VSLCBuZXcgSW50ZWdlcigxKSkpOwotCQlhc3NlcnROdWxsKGlkbXAuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKElOVEVHRVIpKTsKLQkJYXNzZXJ0TnVsbChpZG1wLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhJTlRFR0VSKSk7Ci0JCWFzc2VydE51bGwoaWRtcC5nZXRFeHRlbmRlZENvbnRleHQoKSk7Ci0JCWFzc2VydE51bGwoaWRtcC5nZXREZWZhdWx0T3BlcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGlkbXAuZ2V0SUQoKS5lcXVhbHMoaWRtcC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlpZG1wLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24oKSB7Ci0JCWRtbyA9IG5ldyBETU9wKCk7Ci0JCWRtbyA9IG5ldyBETU9wKGRtKTsKLQkJaWRtbyA9IGRtbzsKLQkJZG1vLnNldElEKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShkbW8uZ2V0SUQoKS5lcXVhbHMoImZvbyIpKTsKLQkJZG1vLnNldERhdGFNb2RlbChkbSk7Ci0JCWFzc2VydFRydWUoZG0gPT0gZG1vLmdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElEYXRhTW9kZWxPcGVyYXRpb24oKSB7Ci0JCWRtbyA9IG5ldyBETU9wKCk7Ci0JCWlkbW8gPSBkbW87Ci0JCWlkbW8uc2V0SUQoImZvbyIpOwotCQlhc3NlcnRUcnVlKGlkbW8uZ2V0SUQoKS5lcXVhbHMoImZvbyIpKTsKLQkJaWRtby5zZXREYXRhTW9kZWwoZG0pOwotCQlhc3NlcnRUcnVlKGRtID09IGlkbW8uZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTIzZjkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9UZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3REYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGVzdERhdGFNb2RlbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5zdGFuY2VDb3VudCA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRJbnN0YW5jZUNvdW50KCkgewotCQlyZXR1cm4gaW5zdGFuY2VDb3VudDsKLQl9Ci0KLQotCXB1YmxpYyBUZXN0RGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlQ291bnQrKzsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJVGVzdERhdGFNb2RlbC5GT08pOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQlyZXR1cm4gSVRlc3REYXRhTW9kZWwuY2xhc3MuZ2V0TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RMaXN0ZW5lci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1Rlc3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWRlYjE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9UZXN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBJRGF0YU1vZGVsTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZXZlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgY2xlYXJFdmVudHMoKSB7Ci0JCWV2ZW50cy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEV2ZW50cygpIHsKLQkJcmV0dXJuIGV2ZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJZXZlbnRzLmFkZChldmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL1ZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmOGFiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkNvbW1vblRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQSA9ICJBIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQiA9ICJCIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQyA9ICJDIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGFsbFByb3BlcnRpZXMgPSBuZXcgU3RyaW5nW117QSwgQiwgQ307Ci0KLQotCXByaXZhdGUgY2xhc3MgUCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0KLQkJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCl7Ci0JCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKEEpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoQik7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChDKTsKLQkJCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJdmFsaWRhdGlvbkxpc3QuYWRkKHByb3BlcnR5TmFtZSk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDb21tb25UZXN0c1BsdWdpbi5QTFVHSU5fSUQsIDAsICJlcnJvciIsIG51bGwpOwotCXByaXZhdGUgSVN0YXR1cyBva1N0YXR1cyA9IElEYXRhTW9kZWxQcm92aWRlci5PS19TVEFUVVM7Ci0KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0JcHJpdmF0ZSBMaXN0IHZhbGlkYXRpb25MaXN0OwotCi0JcHJpdmF0ZSBJRGF0YU1vZGVsIGRtOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUCgpKTsKLQkJc3RhdHVzID0gb2tTdGF0dXM7Ci0JCXZhbGlkYXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIF90ZXN0QmFzaWNWYWxpZGF0aW9uKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJYm9vbGVhbiBvayA9IGkgPT0gMDsKLQkJCXN0YXR1cyA9IG9rID8gb2tTdGF0dXMgOiBlcnJvclN0YXR1czsKLQotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQkJCWFzc2VydFRydWUoZG0uaXNWYWxpZCgpID09IG9rKTsKLQkJCWFzc2VydEVxdWFscyhvayA/IDUgOiAxLCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhBKSB8fCB2YWxpZGF0aW9uTGlzdC5jb250YWlucyhJRGF0YU1vZGVsUHJvcGVydGllcy5BTExPV19FWFRFTlNJT05TKSB8fCB2YWxpZGF0aW9uTGlzdC5jb250YWlucyhJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TKSk7Ci0JCQlpZiAob2spIHsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEIpKTsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEMpKTsKLQkJCX0KLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0KLQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGUoKS5pc09LKCkgPT0gb2spOwotCQkJLy8gVE9ETwotCQkJLy9hc3NlcnRFcXVhbHMob2sgPyAzIDogMSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQSkgfHwgdmFsaWRhdGlvbkxpc3QuY29udGFpbnMoSURhdGFNb2RlbFByb3BlcnRpZXMuQUxMT1dfRVhURU5TSU9OUykgfHwgdmFsaWRhdGlvbkxpc3QuY29udGFpbnMoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUykpOwotCQkJaWYgKG9rKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhDKSk7Ci0JCQl9Ci0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCi0JCQlhc3NlcnRUcnVlKGRtLnZhbGlkYXRlKHRydWUpLmlzT0soKSA9PSBvayk7Ci0JCQlhc3NlcnRFcXVhbHMob2sgPyA1IDogMSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0KLQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGUoZmFsc2UpLmlzT0soKSA9PSBvayk7Ci0JCQlhc3NlcnRFcXVhbHMoNSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQSkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEMpKTsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYWxsUHJvcGVydGllcy5sZW5ndGg7IGorKykgewotCQkJCWFzc2VydFRydWUoZG0uaXNQcm9wZXJ0eVZhbGlkKGFsbFByb3BlcnRpZXNbal0pID09IG9rKTsKLQkJCQlhc3NlcnRFcXVhbHMoMSwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKGFsbFByb3BlcnRpZXNbal0pKTsKLQkJCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGVQcm9wZXJ0eShhbGxQcm9wZXJ0aWVzW2pdKS5pc09LKCkgPT0gb2spOwotCQkJCWFzc2VydEVxdWFscygxLCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoYWxsUHJvcGVydGllc1tqXSkpOwotCQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmFsaWRhdGlvbigpIHsKLQkJZG0uYWRkTmVzdGVkTW9kZWwoImEiLCBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQSgpKSk7Ci0JCWRtLmFkZE5lc3RlZE1vZGVsKCJiIiwgRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEIoKSkpOwotCQlkbS5hZGROZXN0ZWRNb2RlbCgiYyIsIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDKCkpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJdmFsaWRhdGlvbkxpc3QuY2xlYXIoKTsKLQkJCXN3aXRjaCAoaSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWFzc2VydFRydWUoZG0uaXNWYWxpZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZSgpLmlzT0soKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMiA6Ci0JCQkJCWFzc2VydFRydWUoZG0udmFsaWRhdGUodHJ1ZSkuaXNPSygpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzIDoKLQkJCQkJYXNzZXJ0VHJ1ZShkbS52YWxpZGF0ZShmYWxzZSkuaXNPSygpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoOCwgdmFsaWRhdGlvbkxpc3Quc2l6ZSgpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQSkpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEMpKTsKLQkJCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImEiKSk7Ci0JCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJiIikpOwotCQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucygiYyIpKTsKLQkJCXZhbGlkYXRpb25MaXN0LmNsZWFyKCk7Ci0JCX0KLQkJc3RhdHVzID0gZXJyb3JTdGF0dXM7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJYXNzZXJ0VHJ1ZSghZG0uaXNWYWxpZCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJYXNzZXJ0VHJ1ZSghZG0udmFsaWRhdGUoKS5pc09LKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQlhc3NlcnRUcnVlKCFkbS52YWxpZGF0ZSh0cnVlKS5pc09LKCkpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIFRPRE8KLQkJCS8vYXNzZXJ0RXF1YWxzKDEsIHZhbGlkYXRpb25MaXN0LnNpemUoKSk7Ci0JCQkvL2Fzc2VydFRydWUoIXZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJhIikpOwotCQkJLy9hc3NlcnRUcnVlKCF2YWxpZGF0aW9uTGlzdC5jb250YWlucygiYiIpKTsKLQkJCS8vYXNzZXJ0VHJ1ZSghdmFsaWRhdGlvbkxpc3QuY29udGFpbnMoImMiKSk7Ci0JCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSghZG0udmFsaWRhdGUoZmFsc2UpLmlzT0soKSk7Ci0JCWFzc2VydEVxdWFscyg4LCB2YWxpZGF0aW9uTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKEEpKTsKLQkJYXNzZXJ0VHJ1ZSh2YWxpZGF0aW9uTGlzdC5jb250YWlucyhCKSk7Ci0JCWFzc2VydFRydWUodmFsaWRhdGlvbkxpc3QuY29udGFpbnMoQykpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJhIikpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKHZhbGlkYXRpb25MaXN0LmNvbnRhaW5zKCJjIikpOwotCQl2YWxpZGF0aW9uTGlzdC5jbGVhcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODIwZTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi0KLXB1YmxpYyBjbGFzcyBBIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0Fic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlMWEzOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbihJRGF0YU1vZGVsIGRtKSB7Ci0JCXN1cGVyKGRtKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5leGVjdXRpb25MaXN0LmFkZChnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUV4dGVuZGVkT3BlcmF0aW9uVGVzdHMuZXhlY3V0aW9uTGlzdC5hZGQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlFeHRlbmRlZE9wZXJhdGlvblRlc3RzLmV4ZWN1dGlvbkxpc3QuYWRkKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FkNDdhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLQotcHVibGljIGNsYXNzIEIgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBCKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9DLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzUxYzYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9DLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotCi1wdWJsaWMgY2xhc3MgQyBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9ELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjcwYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi1wdWJsaWMgY2xhc3MgRCBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiZWY3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLXB1YmxpYyBjbGFzcyBFIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgRSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9FeHRlbmRlZE9wZXJhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRXh0ZW5kZWRPcGVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFiODU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9FeHRlbmRlZE9wZXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwuSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZE9wZXJhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBMaXN0IGV4ZWN1dGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBhID0gQS5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYiA9IEIuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGMgPSBDLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkID0gRC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZSA9IEUuY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGYgPSBGLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnID0gRy5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaCA9IEguY2xhc3MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHIgPSBSLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBjbGFzcyBQYXVzZUxpc3RlbmVyIGltcGxlbWVudHMgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uTGlzdGVuZXIgewotCi0JCXB1YmxpYyBMaXN0IHBhdXNlZE9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIGludCBub3RpZnkoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBvcElEID0gZXZlbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0SUQoKTsKLQkJCWlmIChwYXVzZWRPcGVyYXRpb25zLmNvbnRhaW5zKG9wSUQpKSB7Ci0JCQkJcmV0dXJuIENPTlRJTlVFOwotCQkJfQotCQkJcGF1c2VkT3BlcmF0aW9ucy5hZGQob3BJRCk7Ci0JCQlyZXR1cm4gUEFVU0U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUGF1c2VMaXN0ZW5lciBwYXVzZUxpc3RlbmVyID0gbmV3IFBhdXNlTGlzdGVuZXIoKTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWV4ZWN1dGlvbkxpc3QuY2xlYXIoKTsKLQkJcGF1c2VMaXN0ZW5lci5wYXVzZWRPcGVyYXRpb25zLmNsZWFyKCk7Ci0JCUlQcm9qZWN0IHAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoImZvbyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcC5leGlzdHMoKSkgewotCQkJcC5jcmVhdGUobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXtjLCBhLCBkLCByLCBlLCBiLCBmLCBnLCBofTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBhLCBjLCBkLCBiLCBlLCBmLCBoLCBnfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJZG0uc2V0Qm9vbGVhblByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLkFMTE9XX0VYVEVOU0lPTlMsIGZhbHNlKTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXtyfTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChhKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde3IsIGUsIGIsIGYsIGcsIGh9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3IsIGIsIGUsIGYsIGgsIGd9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSb290RE1Qcm92aWRlcigpKTsKLQkJTGlzdCByZXN0cmljdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGIpOwotCQlkbS5zZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TLCByZXN0cmljdGVkTGlzdCk7Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMgPSBuZXcgU3RyaW5nW117YywgYSwgZCwgcn07Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIgPSBuZXcgU3RyaW5nW117ciwgYSwgYywgZH07Ci0JCWNoZWNrQWxsKGRtLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q09mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlMaXN0IHJlc3RyaWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYyk7Ci0JCWRtLnNldFByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMsIHJlc3RyaWN0ZWRMaXN0KTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXthLCBkLCByLCBlLCBiLCBmLCBnLCBofTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBhLCBkLCBiLCBlLCBmLCBoLCBnfTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDRk9mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlMaXN0IHJlc3RyaWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYyk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChmKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde2EsIGQsIHIsIGUsIGJ9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3IsIGEsIGQsIGIsIGV9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENCT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChjKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGIpOwotCQlkbS5zZXRQcm9wZXJ0eShJRGF0YU1vZGVsUHJvcGVydGllcy5SRVNUUklDVF9FWFRFTlNJT05TLCByZXN0cmljdGVkTGlzdCk7Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMgPSBuZXcgU3RyaW5nW117YSwgZCwgcn07Ci0JCVN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIgPSBuZXcgU3RyaW5nW117ciwgYSwgZH07Ci0JCWNoZWNrQWxsKGRtLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QUVGT2ZmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgZG0gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgUm9vdERNUHJvdmlkZXIoKSk7Ci0JCUxpc3QgcmVzdHJpY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChhKTsKLQkJcmVzdHJpY3RlZExpc3QuYWRkKGUpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoZik7Ci0JCWRtLnNldFByb3BlcnR5KElEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFU1RSSUNUX0VYVEVOU0lPTlMsIHJlc3RyaWN0ZWRMaXN0KTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUmVzdWx0cyA9IG5ldyBTdHJpbmdbXXtyLCBifTsKLQkJU3RyaW5nW10gZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlciA9IG5ldyBTdHJpbmdbXXtyLCBifTsKLQkJY2hlY2tBbGwoZG0sIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIGZvcndhcmRFeHBlY3RlZFBhdXNlT3JkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBQk9mZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFJvb3RETVByb3ZpZGVyKCkpOwotCQlMaXN0IHJlc3RyaWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN0cmljdGVkTGlzdC5hZGQoYSk7Ci0JCXJlc3RyaWN0ZWRMaXN0LmFkZChiKTsKLQkJZG0uc2V0UHJvcGVydHkoSURhdGFNb2RlbFByb3BlcnRpZXMuUkVTVFJJQ1RfRVhURU5TSU9OUywgcmVzdHJpY3RlZExpc3QpOwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzID0gbmV3IFN0cmluZ1tde3J9OwotCQlTdHJpbmdbXSBmb3J3YXJkRXhwZWN0ZWRQYXVzZU9yZGVyID0gbmV3IFN0cmluZ1tde3J9OwotCQljaGVja0FsbChkbSwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgZm9yd2FyZEV4cGVjdGVkUGF1c2VPcmRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQWxsKElEYXRhTW9kZWwgZG0sIFN0cmluZ1tdIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIFN0cmluZ1tdIGV4cGVjdGVkUGF1c2VPcmRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHVuZG9FeHBlY3RlZFJlc3VsdHMgPSByZXZlcnNlU3RyaW5nKGZvcndhcmRFeHBlY3RlZFJlc3VsdHMpOwotCQlib29sZWFuIHNob3VsZFJvbGxCYWNrID0gZmFsc2U7Ci0KLQkJLy8gQ2hlY2sgcmVndWxhciBleGVjdXRpb25zCi0JCUlEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBvcCA9IChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24pZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQljaGVja0V4ZWN1dGlvbihvcCwgZm9yd2FyZEV4cGVjdGVkUmVzdWx0cywgbnVsbCwgc2hvdWxkUm9sbEJhY2spOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIG51bGwpOwotCQljaGVja1JlZG8ob3AsIGZvcndhcmRFeHBlY3RlZFJlc3VsdHMsIG51bGwpOwotCQljaGVja1VuZG8ob3AsIHVuZG9FeHBlY3RlZFJlc3VsdHMsIG51bGwpOwotCi0JCS8vIENoZWNrIGV4ZWN1dGlvbnMgd2l0aCBwYXVzaW5nICYgcmVzdW1pbmcKLQkJb3AgPSAoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uKWRtLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJb3AuYWRkT3BlcmF0aW9uTGlzdGVuZXIocGF1c2VMaXN0ZW5lcik7Ci0JCWNoZWNrRXhlY3V0aW9uKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIsIHNob3VsZFJvbGxCYWNrKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tSZWRvKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQotCQkvLyBDaGVjayBleGVjdXRpb25zIHdpdGggcGF1c2luZywgcmVzdW1pbmcgJiByb2xsaW5nIGJhY2suCi0JCW9wID0gKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbilkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCW9wLmFkZE9wZXJhdGlvbkxpc3RlbmVyKHBhdXNlTGlzdGVuZXIpOwotCQlzaG91bGRSb2xsQmFjayA9IHRydWU7Ci0JCWNoZWNrRXhlY3V0aW9uKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIsIHNob3VsZFJvbGxCYWNrKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tSZWRvKG9wLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzLCBmb3J3YXJkRXhwZWN0ZWRSZXN1bHRzKTsKLQkJY2hlY2tVbmRvKG9wLCB1bmRvRXhwZWN0ZWRSZXN1bHRzLCB1bmRvRXhwZWN0ZWRSZXN1bHRzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHJldmVyc2VTdHJpbmcoU3RyaW5nW10gZm9yd2FyZFN0cmluZykgewotCQlTdHJpbmdbXSByZXZlcnNlU3RyaW5nID0gbmV3IFN0cmluZ1tmb3J3YXJkU3RyaW5nLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmV2ZXJzZVN0cmluZy5sZW5ndGg7IGkrKykgewotCQkJcmV2ZXJzZVN0cmluZ1tpXSA9IGZvcndhcmRTdHJpbmdbZm9yd2FyZFN0cmluZy5sZW5ndGggLSBpIC0gMV07Ci0JCX0KLQkJcmV0dXJuIHJldmVyc2VTdHJpbmc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRXhlY3V0aW9uKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBvcCwgU3RyaW5nW10gZXhwZWN0ZWRSZXN1bHRzLCBTdHJpbmdbXSBleHBlY3RlZFBhdXNlT3JkZXIsIGJvb2xlYW4gcm9sbGJhY2spIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLk5PVF9TVEFSVEVELCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJb3AuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJaWYgKG51bGwgIT0gZXhwZWN0ZWRQYXVzZU9yZGVyKSB7Ci0JCQlpZiAocm9sbGJhY2spIHsKLQkJCQlMaXN0IGNhY2hlZEV4ZWN1dGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2FjaGVkRXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQkJCQljYWNoZWRFeGVjdXRpb25MaXN0LmFkZEFsbChleGVjdXRpb25MaXN0KTsKLQkJCQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5QQVVTRURfRVhFQ1VURSwgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7Ci0JCQkJCW9wLnJvbGxCYWNrKG51bGwsIG51bGwpOwotCQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX1JPTExCQUNLLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJCQkJY2hlY2tSb2xsQmFja1Jlc3VsdHMoY2FjaGVkRXhlY3V0aW9uTGlzdCwgZXhwZWN0ZWRSZXN1bHRzKTsKLQkJCQkJb3AucmVzdW1lKG51bGwsIG51bGwpOwotCQkJCX0KLQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX0VYRUNVVEUsIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQkJCWNoZWNrUmVzdWx0cyhleHBlY3RlZFJlc3VsdHMsIGV4cGVjdGVkUGF1c2VPcmRlcik7CQotCQkJCQotCQkJCXBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5jbGVhcigpOwotCQkJCWV4ZWN1dGlvbkxpc3QuY2xlYXIoKTsKLQkJCQlvcC5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLlBBVVNFRF9FWEVDVVRFLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJCQlvcC5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9FWEVDVVRFLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJY2hlY2tSZXN1bHRzKGV4cGVjdGVkUmVzdWx0cywgZXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQlwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tVbmRvKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbiBvcCwgU3RyaW5nW10gZXhwZWN0ZWRSZXN1bHRzLCBTdHJpbmdbXSBleHBlY3RlZFBhdXNlT3JkZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSAhPSBJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uQ09NUExFVEVfRVhFQ1VURSAmJiBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpICE9IElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9SRURPKSB7Ci0JCQlmYWlsKCJPcGVyYXRpb24gZXhlY3V0aW9uIHN0YXRlIGludmFsaWQgIiArIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJb3AudW5kbyhudWxsLCBudWxsKTsKLQkJaWYgKG51bGwgIT0gZXhwZWN0ZWRQYXVzZU9yZGVyKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkUmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uUEFVU0VEX1VORE8sIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQkJCW9wLnJlc3VtZShudWxsLCBudWxsKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLkNPTVBMRVRFX1VORE8sIG9wLmdldEV4ZWN1dGlvblN0YXRlKCkpOwotCQljaGVja1Jlc3VsdHMoZXhwZWN0ZWRSZXN1bHRzLCBleHBlY3RlZFBhdXNlT3JkZXIpOwotCQlleGVjdXRpb25MaXN0LmNsZWFyKCk7Ci0JCXBhdXNlTGlzdGVuZXIucGF1c2VkT3BlcmF0aW9ucy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1JlZG8oSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIG9wLCBTdHJpbmdbXSBleHBlY3RlZFJlc3VsdHMsIFN0cmluZ1tdIGV4cGVjdGVkUGF1c2VPcmRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24uQ09NUExFVEVfVU5ETywgb3AuZ2V0RXhlY3V0aW9uU3RhdGUoKSk7Ci0JCW9wLnJlZG8obnVsbCwgbnVsbCk7Ci0JCWlmIChudWxsICE9IGV4cGVjdGVkUGF1c2VPcmRlcikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlhc3NlcnRFcXVhbHMoSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uLlBBVVNFRF9SRURPLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJCQlvcC5yZXN1bWUobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKElEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbi5DT01QTEVURV9SRURPLCBvcC5nZXRFeGVjdXRpb25TdGF0ZSgpKTsKLQkJY2hlY2tSZXN1bHRzKGV4cGVjdGVkUmVzdWx0cywgZXhwZWN0ZWRQYXVzZU9yZGVyKTsKLQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCQlwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tSb2xsQmFja1Jlc3VsdHMoTGlzdCBjYWNoZWRFeGVjdXRpb25MaXN0LCBTdHJpbmcgW10gZXhwZWN0ZWRSZXN1bHRzKSB7Ci0JCWFzc2VydEVxdWFscyhjYWNoZWRFeGVjdXRpb25MaXN0LnNpemUoKSAqIDIsIGV4ZWN1dGlvbkxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZWRFeGVjdXRpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXN1bHRzW2ldLCAoU3RyaW5nKWV4ZWN1dGlvbkxpc3QuZ2V0KGkpKTsKLQkJCWFzc2VydEVxdWFscygoU3RyaW5nKWNhY2hlZEV4ZWN1dGlvbkxpc3QuZ2V0KGkpLCAoU3RyaW5nKSBleGVjdXRpb25MaXN0LmdldChleGVjdXRpb25MaXN0LnNpemUoKSAtIDEgLSBpKSk7Ci0JCX0KLQkJZXhlY3V0aW9uTGlzdC5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1Jlc3VsdHMoU3RyaW5nW10gZXhwZWN0ZWRSZXN1bHRzLCBTdHJpbmdbXSBleHBlY3RlZFBhdXNlT3JkZXIpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzdWx0cy5sZW5ndGgsIGV4ZWN1dGlvbkxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdHNbaV0sIChTdHJpbmcpIGV4ZWN1dGlvbkxpc3QuZ2V0KGkpKTsKLQkJfQotCQlpZiAobnVsbCA9PSBleHBlY3RlZFBhdXNlT3JkZXIpIHsKLQkJCWFzc2VydEVxdWFscygwLCBwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuc2l6ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFBhdXNlT3JkZXIubGVuZ3RoLCBwYXVzZUxpc3RlbmVyLnBhdXNlZE9wZXJhdGlvbnMuc2l6ZSgpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRQYXVzZU9yZGVyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGF1c2VPcmRlcltpXSwgKFN0cmluZykgcGF1c2VMaXN0ZW5lci5wYXVzZWRPcGVyYXRpb25zLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9GLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmIwOTljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9GLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotcHVibGljIGNsYXNzIEYgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBGKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0cuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9HLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2I2MDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkOwotCi1wdWJsaWMgY2xhc3MgRyBleHRlbmRzIEFic3RyYWN0SURhdGFNb2RlbFRlc3RPcGVyYXRpb24gewotCi0JcHVibGljIEcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvSC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL0guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzY2NkZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvSC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLXB1YmxpYyBjbGFzcyBIIGV4dGVuZHMgQWJzdHJhY3RJRGF0YU1vZGVsVGVzdE9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgSCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvUi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL1IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxZTE0Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy9kYXRhbW9kZWwvdGVzdHMvZXh0ZW5kZWQvUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIFIgZXh0ZW5kcyBBYnN0cmFjdElEYXRhTW9kZWxUZXN0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBSKElEYXRhTW9kZWwgZG0pewotCQlzdXBlcihkbSk7Ci0JfQotCQotCXB1YmxpYyBSKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL2RhdGFtb2RlbC90ZXN0cy9leHRlbmRlZC9Sb290RE1Qcm92aWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL1Jvb3RETVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2MxZDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvZGF0YW1vZGVsL3Rlc3RzL2V4dGVuZGVkL1Jvb3RETVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUm9vdERNUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFRhcmdldFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoImZvbyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGVlNmUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvZnJhbWV3b3JrdGVzdHMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9mcmFtZXdvcmtzL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC50ZXN0cy5FbnZpcm9ubWVudFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5hcnRpZmFjdGVkaXQudGVzdHMuQXJ0aWZhY3RFZGl0QVBJVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmNvbXBvbmVudGNvcmUudGVzdHMuQWxsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5EYXRhTW9kZWxBUElUZXN0czsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZUIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJUZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIik7Ci0JCQlVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7Ci0JCQlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiVGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzaW5nIHdvcmtpbmcgZGlyZWN0b3J5IHNpbmNlIGEgd29ya3NwYWNlIFVSTCBjb3VsZCBub3QgYmUgbG9jYXRlZC4iKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQl1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0JCVRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCQlpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBdXRvbWF0ZWRCVlQoKSB7Ci0JCXN1cGVyKCk7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZEJWVC5zdWl0ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLQkJCWFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0LmJ2dCIpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KERhdGFNb2RlbEFQSVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFydGlmYWN0RWRpdEFQSVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVudmlyb25tZW50VGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9mcmFtZXdvcmt0ZXN0cy9vcmcvZWNsaXBzZS93c3QvY29tbW9uL2ZyYW1ld29ya3MvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc4NGE4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL2ZyYW1ld29ya3Rlc3RzL29yZy9lY2xpcHNlL3dzdC9jb21tb24vZnJhbWV3b3Jrcy90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlRFY2xpcHNlIGV4dGVuZHMgQXV0b21hdGVkQlZUIHsKLQkKLQlwdWJsaWMgQXV0b21hdGVkQlZURWNsaXBzZSgpewotCQlzdXBlcigpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIik7Ci0gICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJUZXN0RGF0YSIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWJkYjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDU0MzJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJEYXRhTW9kZWxWZXJpZmllciIgbmFtZT0iRGF0YSBNb2RlbCBWZXJpZmllciBGYWN0b3J5IEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvZGF0YU1vZGVsVmVyaWZpZXIuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Iuc3VpdGVzIj4KLSAgICAgICAgIDxzdWl0ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuRGF0YU1vZGVsQVBJVGVzdHMiCi0gICAgICAgICAgICBuYW1lPSJJRGF0YU1vZGVsIEFQSSBUZXN0cyI+Ci0gICAgICAgICA8L3N1aXRlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLkRhdGFNb2RlbFByb3ZpZGVyRXh0ZW5zaW9uIj4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5vcGVyYXRpb25zLnRlc3RzLm1hbmFnZXIuVGVzdFByb3ZpZGVyMSIKLSAgICAgICAgICAgIGlkPSJ0ZXN0cHJvdmlkZXIxIi8+Ci0gICAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3Mub3BlcmF0aW9ucy50ZXN0cy5tYW5hZ2VyLlRlc3RQcm92aWRlcjIiCi0gICAgICAgICAgICBpZD0idGVzdHByb3ZpZGVyMiIvPgotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLm9wZXJhdGlvbnMudGVzdHMubWFuYWdlci5UZXN0RXh0ZW5kZWRQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJ0ZXN0RXh0ZW5kZWRQcm92aWRlciIvPgotICAgICAgPERhdGFNb2RlbFByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0iYm9ndXNDbGFzcyIKLSAgICAgICAgICAgIGlkPSJib2d1cyIvPgotICAgICAgPFByb3ZpZGVyRGVmaW5lc1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJ0ZXN0UHJvdmlkZXJCYXNlIgotICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsIi8+Ci0gICAgICA8UHJvdmlkZXJEZWZpbmVzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9InRlc3RQcm92aWRlckJvZ3VzIgotICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsIi8+Ci0gICAgICA8UHJvdmlkZXJJbXBsZW1lbnRzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9InRlc3RQcm92aWRlckJvZ3VzIgotICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsQm9ndXMiLz4JCQotICAgICAgPFByb3ZpZGVySW1wbGVtZW50c1R5cGUKLSAgICAgIAkJcHJvdmlkZXJUeXBlPSJ0ZXN0UHJvdmlkZXJCb2d1cyIKLSAgICAgIAkJcHJvdmlkZXJJRD0iZmFrZS5ub25yZWdpc3RlcmVkLmZ1bmN0aW9uZ3JvdXAuSVRlc3REYXRhTW9kZWwiCi0JIC8+CSAgIAkJCi0JICA8IS0tIFRlc3QgZm9yIGluY29tcGxldGUgaWQncywgY2xhc3NlcycgYW5kIGR1cGxpY2F0ZXMKLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9IiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLklUZXN0RGF0YU1vZGVsIi8+Ci0gICAgICA8RGF0YU1vZGVsUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLlRlc3REYXRhTW9kZWxQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSIiLz4KLSAgICAgIDxEYXRhTW9kZWxQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuVGVzdERhdGFNb2RlbFByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuSVRlc3REYXRhTW9kZWwiLz4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5jb2xsZWN0b3Iuc3VpdGVzIj4KLSAgICAgIDxzdWl0ZQotICAgICAgICAgICAgY2xhc3M9IiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVCIKLSAgICAgICAgICAgIG5hbWU9IkNvbW1vbiBGcmFtZXdvcmsgQlZUIFRlc3RzIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLQotICAgCQlBIHBpY3R1cmUgb2YgdGhlIG9wZXJhdGlvbiB0cmVlCi0gICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFIKLSAgICAgICAgICAgICAgICAgICAgICAgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgLyAgIFwKLSAgICAgICAgICAgICAgICAgICAgIC8gICAgIFwKLSAgICAgICAgICAgICAgICAgICAgQSAgICAgICBCCi0gICAgICAgICAgICAgICAgICAgLyBcICAgICAvIFwKLSAgICAgICAgICAgICAgICAgIC8gICBcICAgLyAgIFwKLSAgICAgICAgICAgICAgICAgQyAgICAgRCBFICAgICBGCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcKLSAgIC0tPgotICAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuT3BlcmF0aW9uRXh0ZW5zaW9uIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQiPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuUiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5CIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQSIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQSIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5EIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQyIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5GIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRSIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5IIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5IIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuRyIvPgotICAgICAgPG9wZXJhdGlvbkV4dGVuc2lvbgotICAgICAgICAgICAgaWQ9IkFQcmUyIgotICAgICAgICAgICAgcHJlT3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5vcGVyYXRpb25zLnRlc3RzLm1hbmFnZXIuVGVzdEV4dGVuZGVkT3BlcmF0aW9uIi8+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZC5IIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgCi0gICA8IS0tIFVuY29tbWVudCB0aGUgYmVsb3cgaG9vayB0byB0ZXN0IHNwZWNpZmljIG9wZXJhdGlvbiBleHRlbnNpb24gaWRzIHdoZW4gbmVlZGVkIC0tPgotICAgPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZCI+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24iCi0gICAgICAgICAgICBwcmVPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5IZWxsb1ByZU9wZXJhdGlvbkV4dGVuc2lvbiIKLSAgICAgICAgICAgIHBvc3RPcGVyYXRpb25DbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5IZWxsb1Bvc3RPcGVyYXRpb25FeHRlbnNpb24iLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3NjaGVtYS9kYXRhTW9kZWxWZXJpZmllci5leHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy9zY2hlbWEvZGF0YU1vZGVsVmVyaWZpZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyMjhhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3NjaGVtYS9kYXRhTW9kZWxWZXJpZmllci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIgaWQ9ImRhdGFNb2RlbFZlcmlmaWVyIiBuYW1lPSJEYXRhIE1vZGVsIFZlcmlmaWVyIEZhY3RvcnkgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkYXRhTW9kZWxWZXJpZmVyTGlzdCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imxpc3RDbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFlNDEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmpvbmFzLjQzMj0ke2pvbmFzNDMyRGlyfSIvPiAKLSAgICAgICAgICAgIAotICA8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiB2YWx1ZT0iJHtiYXNlZGlyfS8ke3BsdWdpbi1uYW1lfSIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4KLSAgICAKLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0gICAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgotCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0QXJ0aWZhY3RFZGl0LnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvVGVzdEFydGlmYWN0RWRpdC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2N2NlMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0QXJ0aWZhY3RFZGl0LnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvVGVzdFZpcnR1YWxBUEkuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjJkNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9UZXN0VmlydHVhbEFQSS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2Jhc2VEYXRhXzAxLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvYmFzZURhdGFfMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDgzNzY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvYmFzZURhdGFfMDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MiI+Ci0JCTxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj4KLQkJPGVqYj50ZXN0RUpCLmphcjwvZWpiPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyIj4KLQkJPHdlYj4KLQkJCTx3ZWItdXJpPnRlc3RXZWIud2FyPC93ZWItdXJpPgotCQkJPGNvbnRleHQtcm9vdD50ZXN0V2ViPC9jb250ZXh0LXJvb3Q+Ci0JCTwvd2ViPgotCTwvbW9kdWxlPgotPC9hcHBsaWNhdGlvbj4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9lcXVhbFRvXzAxX2Nhc2VfMDEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9lcXVhbFRvXzAxX2Nhc2VfMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzljNjJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvZXF1YWxUb18wMV9jYXNlXzAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPjxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MiI+PGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+PC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPjxlamI+dGVzdEVKQi5qYXI8L2VqYj48L21vZHVsZT48bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA0OTEzOTg0OTgxMiI+PHdlYj48d2ViLXVyaT50ZXN0V2ViLndhcjwvd2ViLXVyaT48Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD48L3dlYj48L21vZHVsZT48L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2VxdWFsVG9fMDFfY2FzZV8wMi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL2VxdWFsVG9fMDFfY2FzZV8wMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZmY3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS9lcXVhbFRvXzAxX2Nhc2VfMDIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQKLSI+ICA8IS0tIGEgY29tbWVudCB0byBpZ25vcmUKLQotCi0KLSAgICAtLT4KLQk8ZGlzcGxheS1uYW1lPgotICAgIHRlc3Q8L2Rpc3BsYXktbmFtZT48bW9kdWxlIGlkPSIKLSAgICBKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NzIKLSAgICAiPjxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPjwvbW9kdWxlPjwhLS0gYSBjb21tZW50IHRvIGlnbm9yZSAtLT4KLQk8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA0OTEzOTg0OTc4MiI+PGVqYj50ZXN0RUpCLmphcjwvZWpiPjwvbW9kdWxlPjxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyCi0gICAgIj48d2ViPjx3ZWItdXJpPnRlc3RXZWIud2FyPC93ZWItdXJpPjxjb250ZXh0LXJvb3Q+dGVzdFdlYjwvY29udGV4dC1yb290Pjwvd2ViPjwvbW9kdWxlPjwvYXBwbGljYXRpb24+Ci0gICAgICAgPCEtLSBhIGNvbW1lbnQgdG8gaWdub3JlIC0tPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wMS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxMDQwYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPnRlc3Q8L2Rpc3BsYXktbmFtZT4KLQk8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NyI+Ci0JCTxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj4KLQkJPGVqYj50ZXN0RUpCLmphcjwvZWpiPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xMDQ5MTM5ODQ5ODEyIj4KLQkJPHdlYj4KLQkJCTx3ZWItdXJpPnRlc3RXZWIud2FyPC93ZWItdXJpPgotCQkJPGNvbnRleHQtcm9vdD50ZXN0V2ViPC9jb250ZXh0LXJvb3Q+Ci0JCTwvd2ViPgotCTwvbW9kdWxlPgotPC9hcHBsaWNhdGlvbj4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy90ZXN0RGF0YS91bmVxdWFsVG9fMDFfY2FzZV8wMi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlYTAyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPnRlc3Q8L2Rpc3BsYXktbmFtZT4KLQk8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNDkxMzk4NDk3NzIiPgotCQk8amF2YT50ZXN0Q2xpZW50LmphcjwvamF2YT4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA0OTEzOTg0OTc4MiI+Ci0JCTxlamI+dGVzdEVKQi5qYXI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA0OTEzOTg0OTgxMiI+Ci0JCTx3ZWI+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzAzLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjI5YzJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotCTxkaXNwbGF5LW5hbWU+dGVzdDwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA0OTEzOTg0OTc3MiI+Ci0JCTxqYXZhPnRlc3RDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDQ5MTM5ODQ5NzgyIj4KLQkJPGVqYj50ZXN0RUpCPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzA0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDBiZDAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT50ZXN0PC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDQ5MTM5ODQ5NzcyIj4KLQkJPGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPgotCQk8ZWpiPnRlc3RFSkIuamFyPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzL3Rlc3REYXRhL3VuZXF1YWxUb18wMV9jYXNlXzA1LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzZiOGJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMvdGVzdERhdGEvdW5lcXVhbFRvXzAxX2Nhc2VfMDUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLSI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT50ZXN0PC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDQ5MTM5ODQ5NzcyIj4KLQkJPGphdmE+dGVzdENsaWVudC5qYXI8L2phdmE+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEwNDkxMzk4NDk3ODIiPgotCQk8ZWpiPnRlc3RFSkIuamFyPC9lamI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNDkxMzk4NDk4MTIiPgotCQk8d2ViPgotCQkJPHdlYi11cmk+dGVzdFdlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290PnRlc3RXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3MzkzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzk2OGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXRlc3RzLmphcgotamF2YUNvbXBpbGVyLnRlc3RzLmphci5hcmdzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGIwNjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGViYWE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gSnVuIDAzIDAwOjM0OjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDRmNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4xLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMuaW50ZXJuYWwuQ2FjaGVUZXN0c1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4yLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlMDM1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlNDhiNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UKLUJ1bmRsZS1OYW1lLjAgPSBDYWNoZSBUZXN0cyBQbHVnLWluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlRW50cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODMwOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVFbnRyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdHMgZm9yIHRoZSBDYWNoZUVudHJ5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVFbnRyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotCS8qKgotCSAgKiBDcmVhdGUgYSB0ZXN0cyBzdWl0ZSBmcm9tIHRoaXMgdGVzdCBjbGFzcy4KLQkgICogCi0JICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotCSAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0JICB7Ci0JICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENhY2hlRW50cnlUZXN0LmNsYXNzKTsKLQkgIH0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIGVudHJ5IGlzIG5vdCBjb25zaWRlcmVkIGV4cGlyZWQgd2hlbiAtMSBpcyBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5vdEV4cGlyZWRXaGVuTWludXNPbmUoKQotCXsKLQkJQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbmV3IENhY2hlRW50cnkobnVsbCwgbnVsbCwgMCwgLTEpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGVudHJ5IGlzIGV4cGlyZWQgd2hlbiAtMSBpcyBzcGVjaWZpZWQuIiwgY2FjaGVFbnRyeS5oYXNFeHBpcmVkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRoYXQgdGhlIGVudHJ5IGlzIG5vdCBjb25zaWRlcmVkIGV4cGlyZWQgd2hlbiB0aGUgc2V0IGV4cGlyYXRpb24KLQkgKiB0aW1lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBzeXN0ZW0gdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RXhwaXJlZFdoZW5HcmVhdGVyVGhhblN5c3RlbVRpbWUoKQotCXsKLQkJQ2FjaGVFbnRyeSBjYWNoZUVudHJ5ID0gbmV3IENhY2hlRW50cnkobnVsbCwgbnVsbCwgMCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyA2MDAwMCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZW50cnkgaXMgZXhwaXJlZCB3aGVuIGdyZWF0ZXIgdGhhbiB0aGUgY3Vycm5ldCBzeXN0ZW0gdGltZS4iLCBjYWNoZUVudHJ5Lmhhc0V4cGlyZWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdGhhdCB0aGUgZW50cnkgaXMgY29uc2lkZXJlZCBleHBpcmVkIHdoZW4gdGhlIHNldCBleHBpcmF0aW9uCi0JICogdGltZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4cGlyZWRXaGVuTGVzc1RoYW5TeXN0ZW1UaW1lKCkKLQl7Ci0JCUNhY2hlRW50cnkgY2FjaGVFbnRyeSA9IG5ldyBDYWNoZUVudHJ5KG51bGwsIG51bGwsIDAsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gNjAwMDApOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgZW50cnkgaXMgbm90IGV4cGlyZWQgd2hlbiBsZXNzIHRoYW4gdGhlIGN1cnJuZXQgc3lzdGVtIHRpbWUuIiwgY2FjaGVFbnRyeS5oYXNFeHBpcmVkKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjQ5NmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvaW50ZXJuYWwvQ2FjaGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIENhY2hlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcml2YXRlIENhY2hlIGNhY2hlOwotCQotCS8qKgotCSAgKiBDcmVhdGUgYSB0ZXN0cyBzdWl0ZSBmcm9tIHRoaXMgdGVzdCBjbGFzcy4KLQkgICogCi0JICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotCSAgKi8KLQkgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0JICB7Ci0JICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKENhY2hlVGVzdC5jbGFzcyk7Ci0JICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQljYWNoZSA9IENhY2hlLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogVGVzdCB0cnlpbmcgdG8gY2FjaGUgYSByZXNvdXJjZSB0aGF0IGRvZXNuJ3QgZXhpc3QKLQkgKiBvbiBhIHNlcnZlciB0aGF0IGRvZXMgZXhpc3QuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldE5vbkV4aXN0YW50UmVzb3VyY2UoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvbm9uZXhpc3RhbnRmaWxlIjsKLQkJU3RyaW5nIHJlc3VsdCA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHJlc3VsdCByZXR1cm5lZCBmb3IgcmVzb3VyY2UgIiArIHJlc291cmNlICsgIiBpcyBub3QgbnVsbC4iLCByZXN1bHQpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRyeWluZyB0byBjYWNoZSBhIHJlc291cmNlIHRoYXQgZG9lc24ndCBleGlzdAotCSAqIGJlY2F1c2UgdGhlIHNlcnZlciBkb2Vzbid0IGV4aXN0LgotCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdEdldE5vbkV4aXN0YW50U2VydmVyKCkKLS8vCXsKLS8vCQlTdHJpbmcgcmVzb3VyY2UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLmJhZC93ZWJ0b29scy9ub25leGlzdGFudGZpbGUiOwotLy8JCVN0cmluZyByZXN1bHQgPSBjYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0vLwkJY2FjaGUuY2xlYXIoKTsKLS8vCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IHJldHVybmVkIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0vLwl9Ci0JCi0JLyoqCi0JICogVGVzdCB0cnlpbmcgdG8gZ2V0IGEgcmVzb3VyY2Ugc3BlY2lmaWVkIGJ5IG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxSZXNvdXJjZSgpCi0JewotCQlTdHJpbmcgcmVzb3VyY2UgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IHJldHVybmVkIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdHJ5aW5nIHRvIGNhY2hlIGEgcmVzb3VyY2UgdGhhdCBkb2VzIGV4aXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZVRoYXRFeGlzdHMoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgcmVzdWx0IHJldHVybmVkIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIHdhcyBudWxsLiIsIHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIlRoZSByZXN1bHQgYW5kIHJlc291cmNlIGFyZSB0aGUgc2FtZS4iLCAhcmVzb3VyY2UuZXF1YWxzKHJlc3VsdCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSB0aGUgcmVzdWx0IHRoYXQgaXMgcmV0dXJuZWQgc3RhcnRzIHdpdGggZmlsZTovLy8KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzdWx0U3RhcnRzV2l0aEZpbGUoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnRUcnVlKCJUaGUgcmVzdWx0IGRvZXMgbm90IHN0YXJ0IHdpdGggZmlsZTovLy8uIiwgcmVzdWx0LnN0YXJ0c1dpdGgoImZpbGU6Ly8vIikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSBkZWxldGluZyBhIGNhY2hlIGVudHJ5IGRlbGV0ZXMgaXQgZnJvbSB0aGUgY2FjaGUgYW5kCi0JICogZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZUNhY2hlRW50cnkoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0ID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgbG9jYWwgY2FjaGUgZmlsZSBpcyBudWxsLiIsIHJlc3VsdCk7Ci0JCS8vIFJlbW92ZSBmaWxlOi8vLyBmcm9tIHRoZSByZXN1bHQuCi0JCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoOCk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBmaWxlICIgKyByZXN1bHQgKyAiIGRvZXMgbm90IGV4aXN0LiIsIG5ldyBGaWxlKHJlc3VsdCkuZXhpc3RzKCkpOwotCQljYWNoZS5kZWxldGVFbnRyeShyZXNvdXJjZSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZmlsZSB3YXMgbm90IGRlbGV0ZWQuIiwgbmV3IEZpbGUocmVzdWx0KS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBzdGlsbCBjb250YWlucyB0aGUgZGVsZXRlZCBlbnRyeS4iLCBjYWNoZS5nZXRDYWNoZWRVUklzKCkubGVuZ3RoID09IDApOwotCQljYWNoZS5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSBkZWxldGluZyBhIG51bGwgY2FjaGUgZW50cnkgc2ltcGx5IHJldHVybnMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZU51bGxDYWNoZUVudHJ5KCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOwotCQljYWNoZS5kZWxldGVFbnRyeShudWxsKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBjYWNoZSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVudHJ5IGFmdGVyIGRlbGV0aW5nIG51bGwuIiwgY2FjaGUuZ2V0Q2FjaGVkVVJJcygpLmxlbmd0aCA9PSAwKTsKLQkJY2FjaGUuY2xlYXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgY2xlYXJpbmcgdGhlIGNhY2hlIHdpdGggYSBzaW5nbGUgZW50cnkgZGVsZXRlcyB0aGUgZW50cnkKLQkgKiBmcm9tIHRoZSBjYWNoZSBhbmQgZGVsZXRlcyB0aGUgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJDYWNoZVdpdGhTaW5nbGVFbnRyeSgpCi0JewotCQlTdHJpbmcgcmVzb3VyY2UxID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMiOwotCQlTdHJpbmcgcmVzdWx0MSA9IGNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMSk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBsb2NhbCBjYWNoZSBmaWxlIGlzIG51bGwgZm9yIHJlc291cmNlMS4iLCByZXN1bHQxKTsKLQkJLy8gUmVtb3ZlIGZpbGU6Ly8vIGZyb20gdGhlIHJlc3VsdC4KLQkJcmVzdWx0MSA9IHJlc3VsdDEuc3Vic3RyaW5nKDgpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgZmlsZSAiICsgcmVzdWx0MSArICIgZG9lcyBub3QgZXhpc3QuIiwgbmV3IEZpbGUocmVzdWx0MSkuZXhpc3RzKCkpOwotCQljYWNoZS5jbGVhcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGNhY2hlIGZpbGUgZm9yIHJlc291cmNlMSB3YXMgbm90IGRlbGV0ZWQuIiwgbmV3IEZpbGUocmVzdWx0MSkuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgY2FjaGUgc3RpbGwgY29udGFpbnMgdGhlIGRlbGV0ZWQgZW50cmllcy4iLCBjYWNoZS5nZXRDYWNoZWRVUklzKCkubGVuZ3RoID09IDApOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IHRvIGVuc3VyZSBjbGVhcmluZyB0aGUgY2FjaGUgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGRlbGV0ZXMgdGhlIGVudHJpZXMKLQkgKiBmcm9tIHRoZSBjYWNoZSBhbmQgZGVsZXRlcyB0aGUgZmlsZXMgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQ2FjaGVXaXRoTXVsdGlwbGVFbnRyaWVzKCkKLQl7Ci0JCVN0cmluZyByZXNvdXJjZTEgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI7Ci0JCVN0cmluZyByZXNvdXJjZTIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI7Ci0JCVN0cmluZyByZXN1bHQxID0gY2FjaGUuZ2V0UmVzb3VyY2UocmVzb3VyY2UxKTsKLQkJU3RyaW5nIHJlc3VsdDIgPSBjYWNoZS5nZXRSZXNvdXJjZShyZXNvdXJjZTIpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgbG9jYWwgY2FjaGUgZmlsZSBpcyBudWxsIGZvciByZXNvdXJjZTEuIiwgcmVzdWx0MSk7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBsb2NhbCBjYWNoZSBmaWxlIGlzIG51bGwgZm9yIHJlc291cmNlMi4iLCByZXN1bHQyKTsKLQkJLy8gUmVtb3ZlIGZpbGU6Ly8vIGZyb20gdGhlIHJlc3VsdC4KLQkJcmVzdWx0MSA9IHJlc3VsdDEuc3Vic3RyaW5nKDgpOwotCQlyZXN1bHQyID0gcmVzdWx0Mi5zdWJzdHJpbmcoOCk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBmaWxlICIgKyByZXN1bHQxICsgIiBkb2VzIG5vdCBleGlzdC4iLCBuZXcgRmlsZShyZXN1bHQxKS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBmaWxlICIgKyByZXN1bHQyICsgIiBkb2VzIG5vdCBleGlzdC4iLCBuZXcgRmlsZShyZXN1bHQyKS5leGlzdHMoKSk7Ci0JCWNhY2hlLmNsZWFyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZmlsZSBmb3IgcmVzb3VyY2UxIHdhcyBub3QgZGVsZXRlZC4iLCBuZXcgRmlsZShyZXN1bHQxKS5leGlzdHMoKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgY2FjaGUgZmlsZSBmb3IgcmVzb3VyY2UyIHdhcyBub3QgZGVsZXRlZC4iLCBuZXcgRmlsZShyZXN1bHQyKS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBjYWNoZSBzdGlsbCBjb250YWlucyB0aGUgZGVsZXRlZCBlbnRyaWVzLiIsIGNhY2hlLmdldENhY2hlZFVSSXMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgdG8gZW5zdXJlIGRlbGV0aW5nIGEgbnVsbCBjYWNoZSBlbnRyeSBzaW1wbHkgcmV0dXJucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zdGFuY2UoKQotCXsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIGNhY2hlIG9iamVjdCBpcyBudWxsLiIsIGNhY2hlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB0byBlbnN1cmUgZ2V0Q2FjaGVFbnRyaWVzIHJldHVybnMgYWxsIG9mIHRoZSBjYWNoZSBlbnRyaWVzIGFuZCBub3QgZW50cmllcyB0aGF0IAotICAgKiBoYXZlbid0IGJlZW4gY2FjaGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYWNoZUVudHJpZXMoKQotCXsKLQkJU3RyaW5nIHJlc291cmNlMSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIjsKLQkJU3RyaW5nIHJlc291cmNlMiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIjsKLQkJU3RyaW5nIHJlc291cmNlMyA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL25vbmV4aXN0YW50ZmlsZSI7Ci0JCWNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMSk7Ci0JCWNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMik7Ci0JCWNhY2hlLmdldFJlc291cmNlKHJlc291cmNlMyk7Ci0JCVN0cmluZ1tdIHVyaXMgPSBjYWNoZS5nZXRDYWNoZWRVUklzKCk7Ci0JCWFzc2VydFRydWUoIlRoZXJlIGFyZSBub3QgMiBlbnRyaWVzIGluIHRoZSBjYWNoZS4iLCB1cmlzLmxlbmd0aCA9PSAyKTsKLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAtMTsgaSsrKQotCQl7Ci0JCSAgU3RyaW5nIHVyaSA9IHVyaXNbaV07Ci0JCSAgaWYoISh1cmkuZXF1YWxzKHJlc291cmNlMSkgfHwgdXJpLmVxdWFscyhyZXNvdXJjZTIpIHx8IHVyaS5lcXVhbHMocmVzb3VyY2UzKSkpCi0JCSAgewotCQkJZmFpbCgiVGhlIFVSSSAiICsgdXJpICsgIiBpcyBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSByZXNvdXJjZXMgcHV0IGluIHRoZSBjYWNoZS4iKTsgIAotCQkgIH0KLQkJfQotCQljYWNoZS5jbGVhcigpOwotCQkKLQl9Ci0JCi0JCi0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9DYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWYxNjE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0NhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBUZXN0cyBmb3IgdGhlIENhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb24gY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uIGNhY2hlUmVzb2x2ZXI7Ci0JCi0JLyoqCi0JICAqIENyZWF0ZSBhIHRlc3RzIHN1aXRlIGZyb20gdGhpcyB0ZXN0IGNsYXNzLgotCSAgKiAKLQkgICogQHJldHVybiBBIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGlzIHRlc3QgY2xhc3MuCi0JICAqLwotCSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLQkgIHsKLQkgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvblRlc3QuY2xhc3MpOwotCSAgfQotCSAgCi0JICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0JICB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWNhY2hlUmVzb2x2ZXIgPSBuZXcgQ2FjaGVVUklSZXNvbHZlckV4dGVuc2lvbigpOwotCQkvLyBUaGUgY2FjaGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gV2UgbmVlZCB0byBlbmFibGUgaXQgZm9yIHRoZSB0ZXN0cy4KLQkJQ2FjaGVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENhY2hlRW5hYmxlZCh0cnVlKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBUZXN0IHRoYXQgdGhlIHJlc3VsdCByZXR1cm5lZCB3aGVuIGEgbnVsbCBzeXN0ZW1JZCBpcyBnaXZlbiBpcyBudWxsLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZU51bGxTeXN0ZW1JZCgpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyIsIG51bGwsIG51bGwpOwotCQlhc3NlcnROdWxsKCJUaGUgcmVzdWx0IGlzIG5vdCBudWxsLiIsIHJlc3VsdCk7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogVGVzdCB0aGF0IHRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiBhIG51bGwgc3lzdGVtSWQgYW5kIGEgbnVsbCBiYXNlbG9jYXRpb24KLQkgICAqIGFyZSBnaXZlbiBpcyBudWxsLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZU51bGxTeXN0ZW1JZEFuZEJhc2Vsb2NhdGlvbigpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydE51bGwoIlRoZSByZXN1bHQgaXMgbm90IG51bGwuIiwgcmVzdWx0KTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBUZXN0IHRoYXQgdGhlIHJlc3VsdCBpcyBzdWNlc3NmdWxseSBjYWNoZWQgd2hlbiBhbiBhYnNvbHV0ZSBzeXN0ZW1JZAotCSAgICogaXMgZ2l2ZW4uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVN5c3RlbUlkKCkKLQkgIHsKLQkgICAgU3RyaW5nIHJlc3VsdCA9IGNhY2hlUmVzb2x2ZXIucmVzb2x2ZShudWxsLCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIiwgbnVsbCwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVGhlIHJlc3VsdCBpcyBudWxsLiIsIHJlc3VsdCk7Ci0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogVGVzdCB0aGF0IHRoZSByZXN1bHQgaXMgc3VjZXNzZnVsbHkgY2FjaGVkIHdoZW4gYW4gYWJzb2x1dGUgc3lzdGVtSWQKLQkgICAqIGlzIGdpdmVuIGFuZCBhIG51bGwgYmFzZSBsb2NhdGlvbiBpcyBnaXZlbgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVTeXN0ZW1JZE51bGxCYXNlbG9jYXRpb24oKQotCSAgewotCSAgICBTdHJpbmcgcmVzdWx0ID0gY2FjaGVSZXNvbHZlci5yZXNvbHZlKG51bGwsIG51bGwsIG51bGwsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSByZXN1bHQgaXMgbnVsbC4iLCByZXN1bHQpOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIFRlc3QgdGhhdCB0aGUgcmVzdWx0IGlzIHN1Y2Vzc2Z1bGx5IGNhY2hlZCB3aGVuIGEgcmVsYXRpdmUgc3lzdGVtSWQKLQkgICAqIGlzIGdpdmVuLgotCSAgICovCi0JICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVTeXN0ZW1JZCgpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9jb21tdW5pdHkvc29tZWZpbGUueG1sIiwgbnVsbCwgImluZGV4LnBocCIpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgcmVzdWx0IGlzIG51bGwuIiwgcmVzdWx0KTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBUZXN0IHRoYXQgdGhlIHJlc3VsdCBpcyB1bnN1Y2Vzc2Z1bGx5IGNhY2hlZCB3aGVuIGEgcmVsYXRpdmUgc3lzdGVtSWQKLQkgICAqIGlzIGdpdmVuIGFuZCBhIG51bGwgYmFzZSBsb2NhdGlvbiBpcyBnaXZlbi4KLQkgICAqLwotCSAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlU3lzdGVtSWRXaWxsTnVsbEJhc2Vsb2NhdGlvbigpCi0JICB7Ci0JICAgIFN0cmluZyByZXN1bHQgPSBjYWNoZVJlc29sdmVyLnJlc29sdmUobnVsbCwgbnVsbCwgbnVsbCwgImNvbW11bml0eS5odG1sIik7Ci0JCWFzc2VydE51bGwoIlRoZSByZXN1bHQgaXMgbm90IG51bGwuIiwgcmVzdWx0KTsKLQkgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgbnVsbCBpcyByZXR1cm5lZCB3aGVuIHRoZSBjYWNoZSBpcyBkaXNhYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuc051bGxXaGVuRGlzYWJsZWQoKQotICAgIHsKLSAgICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDYWNoZUVuYWJsZWQoZmFsc2UpOwotICAgICAgU3RyaW5nIHJlc3VsdCA9IGNhY2hlUmVzb2x2ZXIucmVzb2x2ZShudWxsLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy8iLCBudWxsLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy8iKTsKLSAgICAgIGFzc2VydE51bGwoIlRoZSByZXN1bHQgaXMgbm90IG51bGwuIiwgcmVzdWx0KTsKLSAgICAgIENhY2hlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDYWNoZUVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViZDAxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIExpY2Vuc2VSZWdpc3RyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAvKioKLSAgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0gICAqICAKLSAgICogQHJldHVybiBBIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGlzIHRlc3QgY2xhc3MuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoTGljZW5zZVJlZ2lzdHJ5VGVzdC5jbGFzcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQlzdXBlci5zZXRVcCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0Jc3VwZXIudGVhckRvd24oKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgYWRkaW5nIGEgbGljZW5zZSB0byB0aGUgcmVnaXN0cnkuIFdoZW4gYWRkZWQgdGhlIHJlZ2lzdHJ5IHNob3VsZCBjb250YWluIHRoZSBsaWNlbnNlCi0gICAqIGFuZCB0aGUgbGljZW5zZSBzaG91bGQgaGF2ZSB0aGUgdW5zcGVjaWZpZWQgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QWRkTGljZW5zZVRvUmVnaXN0cnkoKQotICB7Ci0JU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLQlMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIHJlZ2lzdHJ5ID0gbmV3IExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIoKTsKLQlyZWdpc3RyeS5hZGRMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IGRvZXMgbm90IGhhdmUgMSBsaWNlbnNlLiIsIDEsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuc2l6ZSgpKTsKLQlhc3NlcnRUcnVlKCJUaGUgcmVnaXN0cnkgZG9lcyBub3QgY29uYWluIHRoZSBsaWNlbnNlICIgKyBsaWNlbnNlVVJMLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLmNvbnRhaW5zS2V5KGxpY2Vuc2VVUkwpKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgbGljZW5zZS4iLCBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyLkxJQ0VOU0VfVU5TUEVDSUZJRUQsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuZ2V0KGxpY2Vuc2VVUkwpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgYWRkaW5nIGEgbGljZW5zZSB0byB0aGUgcmVnaXN0cnkgdHdpY2UuIFRoZSByZWdpc3RyeSBzaG91bGQgb25seSBoYXZlIGEgc2luZ2xlIGVudHJ5Ci0gICAqIGZvciB0aGUgbGljZW5zZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBZGRMaWNlbnNlVG9SZWdpc3RyeVR3aWNlKCkKLSAgewotCVN0cmluZyBsaWNlbnNlVVJMID0gImh0dHA6Ly9zb21lbGljZW5zZSI7Ci0JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0JcmVnaXN0cnkuYWRkTGljZW5zZShsaWNlbnNlVVJMKTsKLQlyZWdpc3RyeS5hZGRMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgbGljZW5zZS4iLCAxLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLnNpemUoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IGFncmVlIHRvIGxpY2Vuc2UgbWV0aG9kLiBUaGUgcmVnaXN0cnkgc2hvdWxkIGhhdmUgJ2FncmVlJyByZWdpc3RlcmVkIGZvciB0aGUgbGljZW5zZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBZ3JlZVRvTGljZW5zZSgpCi0gIHsKLSAgICBTdHJpbmcgbGljZW5zZVVSTCA9ICJodHRwOi8vc29tZWxpY2Vuc2UiOwotCUxpY2Vuc2VSZWdpc3RyeVdyYXBwZXIgcmVnaXN0cnkgPSBuZXcgTGljZW5zZVJlZ2lzdHJ5V3JhcHBlcigpOwotCXJlZ2lzdHJ5LmFkZExpY2Vuc2UobGljZW5zZVVSTCk7Ci0JcmVnaXN0cnkuYWdyZWVMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoZSBsaWNlbnNlLiIsIExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIuTElDRU5TRV9BR1JFRSwgcmVnaXN0cnkuZ2V0TGljZW5zZXNIYXNodGFibGUoKS5nZXQobGljZW5zZVVSTCkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCBhZ3JlZSB0byBsaWNlbnNlIHRoYXQgaXMgbm90IGluIHRoZSByZWdpc3RyeS4gVGhlIHJlZ2lzdHJ5IHNob3VsZCBub3QgY3JlYXRlCi0gICAqIGFuIGVudHJ5IGZvciB0aGUgbGljZW5zZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBZ3JlZVRvTGljZW5zZU5vdEluUmVnaXN0cnkoKQotICB7Ci0gICAgU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLQlMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIHJlZ2lzdHJ5ID0gbmV3IExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIoKTsKLQlyZWdpc3RyeS5hZ3JlZUxpY2Vuc2UobGljZW5zZVVSTCk7Ci0JYXNzZXJ0RXF1YWxzKCJUaGUgcmVnaXN0cnkgcmVnaXN0ZXJlZCB0aGUgbGljZW5zZSBidXQgaXQgc2hvdWxkIG5vdCBoYXZlLiIsIDAsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuc2l6ZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgZGlzYWdyZWUgdG8gbGljZW5zZSBtZXRob2QuIFRoZSByZWdpc3RyeSBzaG91bGQgaGF2ZSAnZGlzYWdyZWUnIHJlZ2lzdGVyZWQgZm9yIHRoZSBsaWNlbnNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdERpc2dyZWVUb0xpY2Vuc2UoKQotICB7Ci0gICAgU3RyaW5nIGxpY2Vuc2VVUkwgPSAiaHR0cDovL3NvbWVsaWNlbnNlIjsKLQlMaWNlbnNlUmVnaXN0cnlXcmFwcGVyIHJlZ2lzdHJ5ID0gbmV3IExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIoKTsKLQlyZWdpc3RyeS5hZGRMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCXJlZ2lzdHJ5LmRpc2FncmVlTGljZW5zZShsaWNlbnNlVVJMKTsKLQlhc3NlcnRFcXVhbHMoIlRoZSByZWdpc3RyeSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgbGljZW5zZS4iLCBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyLkxJQ0VOU0VfRElTQUdSRUUsIHJlZ2lzdHJ5LmdldExpY2Vuc2VzSGFzaHRhYmxlKCkuZ2V0KGxpY2Vuc2VVUkwpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgZGlzYWdyZWUgdG8gbGljZW5zZSB0aGF0IGlzIG5vdCBpbiB0aGUgcmVnaXN0cnkuIFRoZSByZWdpc3RyeSBzaG91bGQgbm90IGNyZWF0ZQotICAgKiBhbiBlbnRyeSBmb3IgdGhlIGxpY2Vuc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWdyZWVUb0xpY2Vuc2VOb3RJblJlZ2lzdHJ5KCkKLSAgewotICAgIFN0cmluZyBsaWNlbnNlVVJMID0gImh0dHA6Ly9zb21lbGljZW5zZSI7Ci0JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0JcmVnaXN0cnkuYWdyZWVMaWNlbnNlKGxpY2Vuc2VVUkwpOwotCWFzc2VydEVxdWFscygiVGhlIHJlZ2lzdHJ5IHJlZ2lzdGVyZWQgdGhlIGxpY2Vuc2UgYnV0IGl0IHNob3VsZCBub3QgaGF2ZS4iLCAwLCByZWdpc3RyeS5nZXRMaWNlbnNlc0hhc2h0YWJsZSgpLnNpemUoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IHByb21wdCBmb3IgYWdyZWUgZm9yIGxpY2Vuc2Ugbm90IGluIHJlZ2lzdHJ5LgotICAgKiBUT0RPOiBUaGlzIHRlc3QgZG9lcyBub3QgdGVzdCB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvLgotICAgKiBUaGlzIHRlc3Qgc2hvdWxkIGJlIGNvcnJlY3RlZCBpZiBwb3NzaWJsZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgdGVzdFByb21wdEZvckxpY2Vuc2VOb3RJblJlZ2lzdHJ5KCkKLS8vICB7Ci0vLyAgICBTdHJpbmcgbGljZW5zZVVSTCA9ICJodHRwOi8vc29tZWxpY2Vuc2UiOwotLy8JTGljZW5zZVJlZ2lzdHJ5V3JhcHBlciByZWdpc3RyeSA9IG5ldyBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCk7Ci0vLwlhc3NlcnRUcnVlKCJUaGUgcHJvbXB0IGZvciBhZ3JlZW1lbnQgbWV0aG9kIGRvZXMgbm90IHJldHVybiB0cnVlIGZvciBhIGxpY2Vuc2Ugbm90IGluIHRoZSByZWdpc3RyeS4iLCByZWdpc3RyeS5wcm9tcHRUb0FjY2VwdExpY2Vuc2UobGljZW5zZVVSTCwgbGljZW5zZVVSTCkpOwotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVdyYXBwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL2ludGVybmFsL0xpY2Vuc2VSZWdpc3RyeVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0YjFlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS9pbnRlcm5hbC9MaWNlbnNlUmVnaXN0cnlXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICogQSB3cmFwcGVyIGZvciBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUuaW50ZXJuYWwuTGljZW5zZVJlZ2lzdHJ5Ci0gKiB0aGF0IGFsbG93cyBmb3IgdGVzdGluZyBvZiBwcm90ZWN0ZWQgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIExpY2Vuc2VSZWdpc3RyeVdyYXBwZXIgZXh0ZW5kcyBMaWNlbnNlUmVnaXN0cnkgCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX1VOU1BFQ0lGSUVEID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfVU5TUEVDSUZJRUQ7Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0FHUkVFID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfQUdSRUU7Ci0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZWdlciBMSUNFTlNFX0RJU0FHUkVFID0gTGljZW5zZVJlZ2lzdHJ5LkxJQ0VOU0VfRElTQUdSRUU7Ci0gIHByb3RlY3RlZCBMaWNlbnNlUmVnaXN0cnlXcmFwcGVyKCkKLSAgewotCXN1cGVyKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0TGljZW5zZXNIYXNodGFibGUoKQotICB7Ci0JcmV0dXJuIGxpY2Vuc2VzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWdyZWVMaWNlbnNlKFN0cmluZyB1cmwpIAotICB7Ci0Jc3VwZXIuYWdyZWVMaWNlbnNlKHVybCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkaXNhZ3JlZUxpY2Vuc2UoU3RyaW5nIHVybCkgCi0gIHsKLQlzdXBlci5kaXNhZ3JlZUxpY2Vuc2UodXJsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgcHJvbXB0VG9BY2NlcHRMaWNlbnNlKFN0cmluZyB1cmwsIFN0cmluZyBsaWNlbnNlVVJMKSAKLSAgewotCXJldHVybiBzdXBlci5wcm9tcHRUb0FjY2VwdExpY2Vuc2UodXJsLCBsaWNlbnNlVVJMKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQWxsQ2FjaGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQWxsQ2FjaGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk4NzJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L2ludGVybmV0L2NhY2hlL3Rlc3RzL2ludGVybmFsL0FsbENhY2hlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzLmludGVybmFsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlRW50cnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5DYWNoZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLmludGVybmFsLkNhY2hlVVJJUmVzb2x2ZXJFeHRlbnNpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5jYWNoZS5pbnRlcm5hbC5MaWNlbnNlUmVnaXN0cnlUZXN0OwotLyoqCi0gKiBUaGUgcm9vdCB0ZXN0IHN1aXRlIHRoYXQgY29udGFpbnMgYWxsIG90aGVyIENhY2hlIHRlc3Qgc3VpdGVzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsQ2FjaGVUZXN0cyBleHRlbmRzIGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGUKLXsKLSAgLyoqCi0gICAqIENyZWF0ZSB0aGlzIHRlc3Qgc3VpdGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoaXMgdGVzdCBzdWl0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFsbENhY2hlVGVzdHMoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgQWxsQ2FjaGVUZXN0cygpCi0gIHsKLSAgICBzdXBlcigiQWxsQ2FjaGVUZXN0cyIpOwotCWFkZFRlc3QoQ2FjaGVUZXN0LnN1aXRlKCkpOwotCWFkZFRlc3QoQ2FjaGVFbnRyeVRlc3Quc3VpdGUoKSk7Ci0JYWRkVGVzdChDYWNoZVVSSVJlc29sdmVyRXh0ZW5zaW9uVGVzdC5zdWl0ZSgpKTsKLQlhZGRUZXN0KExpY2Vuc2VSZWdpc3RyeVRlc3Quc3VpdGUoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS90ZXN0cy9pbnRlcm5hbC9DYWNoZVRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9pbnRlcm5ldC9jYWNoZS90ZXN0cy9pbnRlcm5hbC9DYWNoZVRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDRhM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3QvaW50ZXJuZXQvY2FjaGUvdGVzdHMvaW50ZXJuYWwvQ2FjaGVUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZVRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENhY2hlVGVzdHNQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDYWNoZVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZVRlc3RzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDYWNoZVRlc3RzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuYWwuY2FjaGUudGVzdHMuQ2FjaGVUZXN0c1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKCJvcmcuZWNsaXBzZS53c3QuaW50ZXJuYWwuY2FjaGUudGVzdHMiLCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTUyMmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdAotICAgIG5hbWU9InRlc3RzdWl0ZSIKLSAgICBkZWZhdWx0PSJydW4iCi0gICAgYmFzZWRpcj0iLiI+Ci0KLSAgICA8IS0tIAotICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byBjaGFuZ2Ugd2hhdCdzIGFib3ZlLgotICAgICAgICAgKGlmIHRoZXJlIGlzLCBsZXQgdXMga25vdyBpZiB0aGUgc2NyaXB0IGNhbiBiZSBpbXByb3ZlZC4pCi0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAtLT4KLQotICAgIDwhLS0gCi0gICAgICAgICBFdmVyeSBzdWl0ZSBuZWVkcyB0byBzcGVjaWZ5IHRocmVlIHRoaW5nOiAKLSAgICAgICAgICAgICBwbHVnaW4tbmFtZSwgCi0gICAgICAgICAgICAgY2xhc3NuYW1lIC0gdGhhdCBwcm92aWRlcyB0aGUgc3VpdGUgdG8gdGVzdCwgYW5kIAotICAgICAgICAgICAgIHRlc3RUeXBlIC0gZWl0aGVyIGNvcmUtdGVzdCwgb3IgdWktdGVzdC4gCi0gICAgICAgICBUaGVyZSBpcyBhbiBvcHRpb25hbCBleHRyYVZNYXJncyBwcm9wZXJ0eSB0aGF0IHNvbWUgdGVzdHMgbmVlZCB0byB1c2UgaW4gb3JkZXIgdG8gc3BlY2lmeSAgCi0gICAgICAgICBleHRyYSwgbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgdG8gdGhlIFZNIHdoZW4gaXQgcnVucy4gSWYgbm90IG5lZWQsIG5vIG5lZWQgdG8gc3BlY2lmeSBpdC4gCi0gICAgLS0+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InBsdWdpbi1uYW1lIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmludGVybmV0LmNhY2hlLnRlc3RzIiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJjbGFzc25hbWUiCi0gICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQuY2FjaGUudGVzdHMuaW50ZXJuYWwuQWxsQ2FjaGVUZXN0cyIgLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0idGVzdFR5cGUiCi0gICAgICAgIHZhbHVlPSJjb3JlLXRlc3QiIC8+Ci0KLSAgICA8IS0tIHNvbWUgdGVzdCBzdWl0ZXMgbmVlZCB0byBhZGQgc3BlY2lhbCB2bSBhcmd1bWVudHMgd2hlbiB0aGV5IHJ1bi4gVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUuCi0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9ImV4dHJhVk1hcmdzIgotICAgICAgICB2YWx1ZT0iLURqc2ZSdW50aW1lSmFyc0RpcmVjdG9yeVYxLjE9JHt0ZXN0RGlyfS8ke2pzZjEuMURpcn0iIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iZXh0cmFWTWFyZ3MgJHtleHRyYVZNYXJnc30iIC8+Ci0gICAgLS0+Ci0gICAgCi0gICAgPCEtLSAKLSAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAgICAgICAgVGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gY2hhbmdlIHdoYXQncyBiZWxvdy4KLSAgICAgICAgIChpZiB0aGVyZSBpcywgbGV0IHVzIGtub3cgaWYgdGhlIHNjcmlwdCBjYW4gYmUgaW1wcm92ZWQuKQotICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgLS0+Ci0gICAgCi0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGVjbGlwc2UtaG9tZSBtdXN0IGJlIHByb3ZlZCIKLSAgICAgICAgdW5sZXNzPSJlY2xpcHNlLWhvbWUiIC8+Ci0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGJ1aWxkRGlyZWN0b3J5IG11c3QgYmUgcHJvdmVkIgotICAgICAgICB1bmxlc3M9ImJ1aWxkRGlyZWN0b3J5IiAvPgotICAgIDxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBidWlsZExhYmVsIG11c3QgYmUgcHJvdmVkIgotICAgICAgICB1bmxlc3M9ImJ1aWxkTGFiZWwiIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iYmFzZWRpcjogJHtiYXNlZGlyfSIgLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJlY2xpcHNlLWhvbWU6ICR7ZWNsaXBzZS1ob21lfSIgLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJidWlsZERpcmVjdG9yeTogJHtidWlsZERpcmVjdG9yeX0iIC8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0icGx1Z2luLW5hbWU6ICR7cGx1Z2luLW5hbWV9IiAvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9ImNsYXNzbmFtZTogJHtjbGFzc25hbWV9IiAvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9InRlc3RUeXBlICR7dGVzdFR5cGV9IiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIiAvPgotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJ3b3Jrc3BhY2UiCi0gICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanVuaXR3b3Jrc3BhY2VzLyR7cGx1Z2luLW5hbWV9IiAvPgotCi0gICAgICA8IS0tIAotICAgIFRoaXMgaW5pdCB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvcgotICAgICAgYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMKLSAgICAgIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiBIZXJlIGl0J3MgYSBnb29kIGlkZWEgCi0gICAgdG8gZGVsZXRlIHRoaW5ncyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkIGlmIHRoZSB0ZXN0IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgcmFuLCBqdXN0IGluIGNhc2UgdGhlIHRlc3QgaXMgYmVpbmcgcmUtcmFuLiAKLSAgICAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImluaXQiPgotICAgICAgICA8dHN0YW1wIC8+Ci0gICAgICAgIDxkZWxldGU+Ci0gICAgICAgICAgICA8ZmlsZXNldAotICAgICAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9IgotICAgICAgICAgICAgICAgIGluY2x1ZGVzPSIke3BsdWdpbi1uYW1lfS4qeG1sIiAvPgotICAgICAgICA8L2RlbGV0ZT4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gCi0gICAgICAgICBtYWtlIHRoZSB3b3Jrc3BhY2UgZGlyZWN0b3J5LCBpbiBjYXNlIHBhdGggZG9lc24ndCBleGlzdCB5ZXQKLSAgICAgICAgIGJ1dCBkZWxldGUgdG8gbWFrZSBzdXJlIGZyZXNoIGNvbnRlbnRzLCBpZiBpdCBkb2VzIGV4aXN0Ci0gICAgICAgIC0tPgotICAgICAgICA8ZGVsZXRlCi0gICAgICAgICAgICBkaXI9IiR7d29ya3NwYWNlfSIKLSAgICAgICAgICAgIHF1aWV0PSJ0cnVlIiAvPgotICAgICAgICA8bWtkaXIKLSAgICAgICAgICAgIGRpcj0iJHt3b3Jrc3BhY2V9IiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSAKLSAgICAgIFRoaXMgc3VpdGUgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJzdWl0ZSI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iJHt0ZXN0VHlwZX0iCi0gICAgICAgICAgICBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iCi0gICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJkYXRhLWRpciIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHt3b3Jrc3BhY2V9IiAvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0icGx1Z2luLW5hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9IiAvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke2NsYXNzbmFtZX0iIC8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJwbHVnaW4tcGF0aCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iIC8+Ci0gICAgICAgIDwvYW50PgotICAgICAgICA8Y29weQotICAgICAgICAgICAgZmFpbG9uZXJyb3I9ImZhbHNlIgotICAgICAgICAgICAgZmlsZT0iJHt3b3Jrc3BhY2V9Ly5tZXRhZGF0YS8ubG9nIgotICAgICAgICAgICAgdG9maWxlPSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L3Rlc3RSZXN1bHRzL2NvbnNvbGVsb2dzLyR7cGx1Z2luLW5hbWV9LmNvbnNvbGVsb2cudHh0IiAvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgIDwhLS0gCi0gICAgIFRoaXMgY2xlYW4gdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlcgotICAgICBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIAotICAgICBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQsIGlmIHJlcXVpcmVkLiBCdXQsIAotICAgICBpdCdzIHVzdWFsbHkgYmVzdCB0byBsZWF2ZSBpdCBhbGwsIGluIGNhc2UgeW91J2QgbGlrZSB0byBpbnNwZWN0IGl0IAotICAgICBhZnRlciBhIGZhaWxlZCBydW4uIEl0IHdpbGwgYmUgZGVsZXRlZCBldmVudHVhbGx5IGJ5IHRoZSBuZXh0IGNsZWFuIGJ1aWxkLiAKLSAgICAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImNsZWFudXAiPgotCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIAotICAgICAgIFRoaXMgcnVuIHRhcmdldCBpcyB0aGUgbWFzdGVyIHRhcmdldCB0aGF0IGdldCdzIGFsbCB0aGUgd29yayBkb25lLiAKLSAgICAgICBNb3N0IGFjdGl2aXR5IGlzIGFjdHVhbGx5IGRvbmUgaW4gdGhlICdkZXBlbmRzJyB0YXNrcywgYnV0IGFueSAKLSAgICAgICBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIAotICAgICAgIHNob3VsZCBnbyBoZXJlLCBzdWNoIGFzIGNvcHlpbmcgdGhlIHJlc3VsdHMgdG8gYSBjb21tb24gJ3NhdmUnIAotICAgICAgIGRpcmVjdG9yeS4gCi0gICAgLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJydW4iCi0gICAgICAgIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iY29sbGVjdCIKLSAgICAgICAgICAgIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIKLSAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImluY2x1ZGVzIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS4qeG1sIiAvPgotICAgICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgbmFtZT0ib3V0cHV0LWZpbGUiCi0gICAgICAgICAgICAgICAgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIgLz4KLSAgICAgICAgPC9hbnQ+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=